统计和查看linux的系统状态
/proc的意义及说明
在linux中查看各种状态,其实质是查看内核中相关进程的数据结构中的项,通过工具将其格式化后输出出来。但是内核的数据是绝对不能随意查看或更改的,至少不能直接去修改。所以在linux上出现了伪文件系统/proc,这是内核中各属性或状态向外提供访问或修改的接口。
在/proc下,记录了内核自己的数据信息,各进程独立的数据信息,统计信息等。绝大多数文件都是只读不可改的。即使对root也一样,但/proc/sys除外。
其中数字命名的目录对应的是各进程的pid号,其内的文件记录的都是该进程当前的数据信息,且都是只读的,例如记录命令信息的cmdline文件,进程使用哪颗cpu信息cpuset,进程占用内存的信息mem文件,进程IO信息io文件等其他各种信息文件。
1 | [root@xuexi ~]# ls /proc/6982 |
非数字命名的目录各有用途,例如bus表示总线信息,driver表示驱动信息,fs表示文件系统特殊信息,net表示网络信息,tty表示跟物理终端有关的信息,最特殊的两个是/proc/self和/proc/sys。
先说/proc/self目录,它表示的是当前正在访问/proc目录的进程,因为/proc目录是内核数据向外记录的接口,所以当前访问/proc目录的进程表示的就是当前cpu正在执行的进程。如果执行cat /proc/self/cmdline,会发现其结果总是该命令本身,因为cat是手动敲入的命令,它是重要性进程,cpu会立即执行该命令。
再说/proc/sys这个目录,该目录是为管理员提供用来修改内核运行参数的,所以该目录中的文件对root都是可写的,例如管理数据包转发功能的/proc/sys/net/ipv4/ip_forward文件。使用sysctl命令修改内核运行参数,其本质也是修改/proc/sys目录中的文件。
查看进程信息
pstree命令
pstree命令将以树的形式显示进程信息,默认树的分支是收拢的,也不显示pid,要显示这些信息需要指定对应的选项。
1 | pstree [-a] [-c] [-h] [-l] [-p] [pid] |
ps命令
ps命令查看当前这一刻的进程信息,注意查看的是静态进程信息,要查看随时刷新的动态进程信息(如windows的进程管理器那样,每秒刷新一次),使用top或htop命令。
这个命令的man文档及其复杂,它同时支持3种类型的选项:GUN/BSD/UNIX,不同类型的选项其展示的信息格式不一样。有些加了”-“的是SysV风格 的选项,不加”-“的是BSD选项,加不加”-“它们的意义是不一样的,例如ps aux 和ps -aux是不同的。
其实只需掌握少数几个选项即可,关键的是要了解ps显示出的进程信息中每一列代表什么属性。
对于BSD风格的选项,只需知道一个用法ps aux足以,选项”a”表示列出依赖于终端的进程,选项”x”表示列出不依赖于终端的进程,所以两者结合就表示列出所有进程,选项”u”表示展现的进程信息是以用户为导向的,不用管它什么是以用户为导向,用ps aux就没错。
1 | [root@server2 ~]# ps aux | tail |
各列的意义:
1 | %CPU:表示CPU占用百分比,注意,CPU的衡量方式是占用时间,所以百分比的计算方式是"进程占用cpu时间/cpu总时间",而不是cpu工作强度的状态。 |
注意到了没,ps aux没有显示出ppid。
另外常用的ps选项是ps -elf。其中”-e”表示输出全部进程信息,”-f”和”-l”分别表示全格式输出和长格式输出。全格式会输出cmd的全部参数。
1 | [root@server2 ~]# ps -lf |
各列的意义:
1 | F:程序的标志位。0表示该程序只有普通权限,4表示具有root超级管理员权限,1表示该进程被创建的时候只进行了fork,没有进行exec |
ps后grep问题
在ps后加上grep筛选目标进程时,总会发现grep自身进程也被显示出来。先解释下为何会如此。
1 | [root@xuexi ~]# ps aux | grep "crond" |
通过管道将ps结果传递给grep时,管道协调了ps和grep两进程间通信,但管道的本质是进程间数据传递。管道左边的输出数据放入内存,由管道右边的进程读取。假如划分的内存不足以完全存放输出数据,则管道左边的进程将一直等待,直到管道右边取出内存中一部分的数据以让管道左边的进程继续输出,而管道右边的进程在管道左边的进程启动后也立刻启动了(实际上,管道左右两边的进程没有启动的先后顺序,谁先启动完全看内核对这两个进程的调度顺序,换句话说,看人品),但是它一直处于等待状态,等待接收管道传递来的数据(就像是平时执行命令时不给输入文件将会一直等待输入一样)。
也就是说,管道左右两端的进程是同时被创建的(不考虑父进程创建进程消耗的那点时间),但数据传输是有先后顺序的,左边先传,右边后收,所以可能会造成交叉的情况,左边还没执行完,就捕获到了右边的进程信息。在此处体现在ps还没有统计完进程信息时,grep进程就已经被ps抓到了。
要将grep自身进程排除在结果之外,方法有二:
1 | [root@xuexi ~]# ps aux | grep "crond" | grep -v "grep" # 使用-v将grep自己筛选掉 |
第二种方法能成功是因为grep进程被ps捕获时的结果是”grep cron[d]”,而使用cron[d]匹配时,它将只能匹配crond,所以”grep cron[d]”被筛选掉了。其实加上其他字符将更容易理解。
1 | [root@xuexi ~]# ps aux | grep "cron[dabc]" |
uptime命令
1 | [root@xuexi ~]# uptime |
显示当前时间,已开机运行多少时间,当前有多少用户已登录系统,以及3个平均负载值。
所谓负载率(load),即特定时间长度内,cpu运行队列中的平均进程数(包括线程),一般平均每分钟每核的进程数小于3都认为正常,大于5时负载已经非常高。在UNIX系统中,运行队列包括cpu正在执行的进程和等待cpu的进程(即所谓的可运行runable)。在Linux系统中,还包括不可中断睡眠态(IO等待)的进程。运行队列中每出现一个进程,load就加1,进程每退出运行队列,Load就减1。如果是多核cpu,则还要除以核数。
详细信息见man uptime和https://en.wikipedia.org/wiki/Load_(computing)
例如,单核cpu上的负载值为”1.73 0.60 7.98”时,表示:
最近1分钟:1.73表示平均可运行的进程数,这一分钟要一直不断地执行这1.73个进程。0.73个进程等待该核cpu。
最近5分钟:平均进程数还不足1,表示该核cpu在过去5分钟空闲了40%的时间。
最近15分钟:7.98表示平均可运行的进程数,这15分钟要一直不断地执行这7.98个进程。
结合前5分钟的结果,说明前15-前10分钟时间间隔内,该核cpu的负载非常高。
如果是多核cpu,则还要将结果除以核数。例如4核时,某个最近一分钟的负载值为3.73,则意味着有3.73个进程在运行队列中,这些进程可被调度至4核中的任何一个核上运行。最近1分钟的负载值为1.6,表示这一分钟内每核cpu都空闲(1-1.6/4)=60%的时间。
所以,load的理想值是正好等于CPU的核数,小于核数的时候表示cpu有空闲,超出核数的时候表示有进程在等待cpu,即系统资源不足。
top、htop以及iftop命令
top命令查看动态进程状态,默认每5秒刷新一次。
1 | top选项说明: |
以下是top的一次结果。
1 | [root@xuexi ~]# top |
第1行:和w命令的第一行一样,也和uptime命令的结果一样。此行各列分别表示”当前时间”、”已开机时长”、”当前在线用户”、”前1、5、15分钟平均负载率”。
第2行:分别表示总进程数、running状态的进程数、睡眠状态的进程数、停止状态进程数、僵尸进程数。
第3-6行:每颗cpu的状况。
us = user mode
sy = system mode
ni = low priority user mode (nice)(用户空间中低优先级进程的cpu占用百分比)
id = idle task
wa = I/O waiting
hi = servicing IRQs(不可中断睡眠,hard interruptible)
si = servicing soft IRQs(可中断睡眠,soft interruptible)
st = steal (time given to other DomU instances)(被偷走的cpu时间,一般被虚拟化软件偷走)
第7-8行:从字面意思理解即可。
VIRT:虚拟内存总量
RES:实际内存总量
SHR:共享内存量
TIME:进程占用的cpu时间(若开启了时间累积模式,则此处显示的是累积时间)
top命令虽然非常强大,但是太老了。所以有了新生代的top命令htop。htop默认没有安装,需要手动安装。
1 | [root@xuexi ~]# yum -y install htop |
iftop用于动态显示网络接口的数据流量。用法也很简单,按下h键即可获取帮助。
负载高、CPU空闲,说明当前正在执行的任务基本不消耗CPU资源,大量的负载进程都在IO等待中。
可以从ps的进程状态中获取哪些进程是正在运行或运行队列中的(状态为R),哪些进程是在不可中断睡眠中的(状态为D)。
1 | [root@xuexi src]# ps -eTo stat,pid,ppid,comm --no-header |grep -E "^(D|R)" |
vmstat命令
注意vmstat的第一次统计是自开机起的平均值信息,从第二次开始的统计才是指定刷新时间间隔内的资源利用信息,若不指定刷新时间间隔,则默认只显示一次统计信息。
1 | vmstat [-d] [delay [ count]] |
1 | 选项说明: |
iostat命令
1 | iostat主要统计磁盘或分区的整体使用情况。也可以输出cpu信息,甚至是NFS网络文件系统的信息。同vmstat/sar一样,第一次统计的都是自系统开机起的平均统计信息。 |
free命令
1 | free用于查看内存使用情况。CentOS 6和CentOS 7上显示格式不太一样。 |
sar命令
1 | sar是一个非常强大的性能分析工具,它可以获取系统的cpu/等待队列/磁盘IO/内存/网络等性能指标。 |