写在前面的话:本文是假设你已经有了进程、内存、cpu的理论基础而写的,文中涉及的各类状态只给出了简单说明而没有解释它们的意义,若是不懂这些理论性的东西,本文可能让你看的直接想右上角叉叉。关于这些理论,能够阅读我另外一篇文章:http://www.cnblogs.com/f-ck-need-u/p/7058920.htmlhtml
在Linux中查看各类状态,其实质是查看内核中相关进程的数据结构中的项,经过工具将其格式化后输出出来。可是内核的数据是绝对不能随意查看或更改的,至少不能直接去修改。因此,在linux上出现了伪文件系统/proc,它是内核中各属性或状态向外提供访问和修改的接口。前端
在/proc下,记录了内核本身的数据信息,各进程独立的数据信息,统计信息等。绝大多数文件都是只读不可改的,即便对root也同样,但/proc/sys除外,为什么如此稍后解释。linux
其中数字命名的目录对应的是各进程的pid号,其内的文件记录的都是该进程当前的数据信息,且都是只读的,例如记录命令信息的cmdline文件,进程使用哪颗cpu信息cpuset,进程占用内存的信息mem文件,进程IO信息io文件等其余各类信息文件。ios
[root@xuexi ~]# ls /proc/6982 attr clear_refs cpuset fd loginuid mounts numa_maps pagemap schedstat stat task autogroup cmdline cwd fdinfo maps mountstats oom_adj personality sessionid statm wchan auxv comm environ io mem net oom_score root smaps status cgroup coredump_filter exe limits mountinfo ns oom_score_adj sched stack syscall
非数字命名的目录各有用途,例如bus表示总线信息,driver表示驱动信息,fs表示文件系统特殊信息,net表示网络信息,tty表示跟物理终端有关的信息,最特殊的两个是/proc/self和/proc/sys。shell
先说/proc/self目录,它表示的是当前正在访问/proc目录的进程,由于/proc目录是内核数据向外记录的接口,因此当前访问/proc目录的进程表示的就是当前cpu正在执行的进程。若是执行cat /proc/self/cmdline,会发现其结果老是该命令自己,由于cat是手动敲入的命令,它是重要性进程,cpu会当即执行该命令。windows
再说/proc/sys这个目录,该目录是为管理员提供用来修改内核运行参数的,因此该目录中的文件对root都是可写的,例如管理数据包转发功能的/proc/sys/net/ipv4/ip_forward文件。使用sysctl命令修改内核运行参数,其本质也是修改/proc/sys目录中的文件。缓存
pstree命令将以树的形式显示进程信息,默认树的分支是收拢的,也不显示pid,要显示这些信息须要指定对应的选项。bash
pstree [-a] [-c] [-h] [-l] [-p] [pid] 选项说明: -a:显示进程的命令行 -c:展开分支 -h:高亮当前正在运行的进程及其父进程 -p:显示进程pid,此选项也将展开分支 -l:容许显示长格式进程。默认在显示结果中超过132个字符时将截断后面的字符。
例如:网络
ps命令查看当前这一刻的进程信息,注意查看的是静态进程信息,要查看随时刷新的动态进程信息(如windows的进程管理器那样,每秒刷新一次),使用top或htop命令。session
这个命令的man文档及其复杂,它同时支持3种类型的选项:GUN/BSD/UNIX,不一样类型的选项其展现的信息格式不同。有些加了"-"的是SysV风格 的选项,不加"-"的是BSD选项,加不加"-"它们的意义是不同的,例如ps aux 和ps -aux是不一样的。
其实只需掌握少数几个选项便可,关键的是要了解ps显示出的进程信息中每一列表明什么属性。
对于BSD风格的选项,只需知道一个用法ps aux足以,选项"a"表示列出依赖于终端的进程,选项"x"表示列出不依赖于终端的进程,因此二者结合就表示列出全部进程,选项"u"表示展示的进程信息是以用户为导向的,不用管它什么是以用户为导向,用ps aux就没错。
[root@server2 ~]# ps aux | tail USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1340 0.0 0.0 27176 588 ? Ss 20:30 0:00 /usr/sbin/xinetd -stayalive -pidfile /var/run/xinetd.pid root 2266 0.0 0.1 93212 2140 ? Ss 20:30 0:00 /usr/libexec/postfix/master -w postfix 2268 0.0 0.2 93384 3992 ? S 20:30 0:00 qmgr -l -t unix -u postfix 2306 0.0 0.2 93316 3972 ? S 20:31 0:00 pickup -l -t unix -u root 2307 0.0 0.2 145552 5528 ? Ss 20:31 0:00 sshd: root@pts/0 root 2309 0.0 0.0 0 0 ? S< 20:31 0:00 [kworker/3:1H] root 2310 0.0 0.1 116568 3184 pts/0 Ss 20:31 0:00 -bash root 2352 0.0 0.0 0 0 ? S< 20:31 0:00 [kworker/1:2H] root 2355 0.0 0.0 139492 1632 pts/0 R+ 20:34 0:00 ps aux root 2356 0.0 0.0 107928 676 pts/0 R+ 20:34 0:00 tail
各列的意义:
对于BSD风格的ps选项,进程的状态还会显示下面几个组合信息。
注意到了没,ps aux没有显示出ppid。
另外经常使用的ps选项是ps -elf。其中"-e"表示输出所有进程信息,"-f"和"-l"分别表示全格式输出和长格式输出。全格式会输出cmd的所有参数。
[root@server2 ~]# ps -lf F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD 4 S postfix 2306 2266 0 80 0 - 23329 ep_pol 20:31 ? 00:00:00 pickup -l -t unix -u 4 S root 2307 1141 0 80 0 - 36388 poll_s 20:31 ? 00:00:00 sshd: root@pts/0
1 S root 2309 2 0 60 -20 - 0 worker 20:31 ? 00:00:00 [kworker/3:1H] 4 S root 2310 2307 0 80 0 - 29142 wait 20:31 pts/0 00:00:00 -bash 1 S root 2433 2 0 60 -20 - 0 worker 21:21 ? 00:00:00 [kworker/1:1H] 1 S root 2479 2 0 80 0 - 0 worker 21:25 ? 00:00:00 [kworker/1:0] 1 S root 2503 2 0 60 -20 - 0 worker 21:28 ? 00:00:00 [kworker/1:2H] 1 S root 2532 2 0 80 0 - 0 worker 21:30 ? 00:00:00 [kworker/1:1] 0 R root 2539 2310 0 80 0 - 34873 - 21:33 pts/0 00:00:00 ps -elf 0 S root 2540 2310 0 80 0 - 26982 pipe_w 21:33 pts/0 00:00:00 tail
各列的意义:
在ps后加上grep筛选目标进程时,总会发现grep自身进程也被显示出来。
[root@xuexi ~]# ps aux | grep "crond" root 1425 0.0 0.1 117332 1276 ? Ss Jun10 0:00 crond root 8275 0.0 0.0 103256 856 pts/2 S+ 17:07 0:00 grep crond
先解释下为什么会如此。管道是bash建立的,bash建立管道后fork两个子进程,而后两子进程各自exec加载ps程序和grep程序,exec以后这两个子进程就称为ps进程和grep进程,因此ps和grep进程几乎能够认为是同时出现的,尽管ps进程做为管道的首进程(进程组首进程)它是先出现的,可是在ps出现以前确实两个进程都已经fork完成了。也就是说,管道左右两端的进程是同时被建立的(不考虑父进程建立进程消耗的那点时间),但数据传输是有前后顺序的,左边先传,右边后收。
要将grep自身进程排除在结果以外,方法有二:
[root@xuexi ~]# ps aux | grep "crond" | grep -v "grep" # 使用-v将grep本身筛选掉 root 1425 0.0 0.1 117332 1276 ? Ss Jun10 0:00 crond [root@xuexi ~]# ps aux | grep "cron[d]" root 1425 0.0 0.1 117332 1276 ? Ss Jun10 0:00 crond
第二种方法能成功是由于grep进程被ps捕获时的结果是"grep cron[d]",而使用cron[d]匹配时,它将只能匹配crond,因此"grep cron[d]"被筛选掉了。其实加上其余字符将更容易理解。
[root@xuexi ~]# ps aux | grep "cron[dabc]" root 1425 0.0 0.1 117332 1276 ? Ss Jun10 0:00 crond
[root@xuexi ~]# uptime 08:38:11 up 22:35, 2 users, load average: 0.00, 0.01, 0.05
显示当前时间,已开机运行多少时间,当前有多少用户已登陆系统,以及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命令查看动态进程状态,默认每5秒刷新一次。
top选项说明:
-d:指定top刷新的时间间隔,默认是5 秒 -b:批处理模式,每次刷新分批显示 -n:指定top刷新几回就退出,能够配合-b使用 -p:指定监控的pid,指定方式为-pN1 -pN2 ...或-pN1, N2 [,...] -u:指定要监控的用户的进程,能够是uid也能够是user_name
在top动态模式下,按下各类键能够进行不一样操做。使用"h"或"?"能够查看相关键的说明。
如下是top的一次结果。
[root@xuexi ~]# top top - 17:43:44 up 1 day, 14:16, 2 users, load average: 0.10, 0.06, 0.01 Tasks: 156 total, 1 running, 155 sleeping, 0 stopped, 0 zombie Cpu0 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu1 : 0.0%us, 0.0%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.3%si, 0.0%st Cpu2 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu3 : 0.3%us, 0.0%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 1004348k total, 417928k used, 586420k free, 52340k buffers Swap: 2047996k total, 0k used, 2047996k free, 243800k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 19364 1444 1132 S 0.0 0.1 0:00.96 init 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root RT 0 0 0 0 S 0.0 0.0 0:01.28 migration/0 4 root 20 0 0 0 0 S 0.0 0.0 0:00.59 ksoftirqd/0 5 root RT 0 0 0 0 S 0.0 0.0 0:00.00 stopper/0
top命令虽然很是强大,可是太老了。因此有了新生代的top命令htop。htop默认没有安装,须要手动安装。
[root@xuexi ~]# yum -y install htop
htop可使用鼠标完成点击选中。其余使用方法和top相似,使用h查看各按键意义便可。
iftop用于动态显示网络接口的数据流量。用法也很简单,按下h键便可获取帮助。
根据前文uptime中对系统负载(system load)的描述,分析一下这个top的结果。
上图中,系统负载很是之高,最近一分钟的负载量高达383.19,这表示这一分钟有383.19个进程正在运行或等待调度,若是是单核CPU,表示这一分钟要绝不停留地执行这么多进程,若是是8核CPU,表示这一分钟内平均每核心CPU要执行大概50个进程。
从load average上看,确实是很是繁忙的场景。可是看CPU的idle值为98.8,说明CPU很是闲。为何系统负载如此高,CPU却如此闲?
前面解释system load average的时候,已经说明过可运行的(就绪态,即就绪队列的长度)、正在运行的(运行态)和不可中断睡眠(如IO等待)的进程任务都会计算到负载中。如今负载高、CPU空闲,说明当前正在执行的任务基本不消耗CPU资源,大量的负载进程都在IO等待中。
能够从ps的进程状态中获取哪些进程是正在运行或运行队列中的(状态为R),哪些进程是在不可中断睡眠中的(状态为D)。
[root@xuexi src]# ps -eo stat,pid,ppid,comm --no-header |grep -E "^(D|R)" R+ 11864 9624 ps
注意vmstat的第一次统计是自开机起的平均值信息,从第二次开始的统计才是指定刷新时间间隔内的资源利用信息,若不指定刷新时间间隔,则默认只显示一次统计信息。
vmstat [-d] [delay [ count]] vmstat [-f] 选项说明: -f:统计自开机起fork的次数。包括fork、clone、vfork的次数。但不包括exec次数。 -d:显示磁盘统计信息。 delay:刷新时间间隔,若不指定,则只统计一次信息就退出vmstat。 count:总共要统计的次数。
例如,只统计一次信息。
[root@xuexi ~]# vmstat procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 0 583692 52684 244200 0 0 5 3 4 5 0 0 100 0 0
其中各列的意义以下:
Procs
Memory
Swap
IO
System
CPU:统计的是cpu时间百分比,具体信息和top的cpu统计列同样
还能够统计磁盘的IO信息。统计信息的结果很容易看懂,因此略过。
iostat主要统计磁盘或分区的总体使用状况。也能够输出cpu信息,甚至是NFS网络文件系统的信息。同vmstat/sar同样,第一次统计的都是自系统开机起的平均统计信息。
iostat [ -c ] [ -d ] [ -n -h ][ -k | -m ] [ -p [device][,...] ] [ interval [ count ] ] 选项说明: -c:统计cpu信息 -d:统计磁盘信息 -n:统计NFS文件系统信息 -h:使NFS统计信息更人类可读化 -k:指定以kb/s为单位显示 -m:指定以mb/s为单位显示 -p:指定要统计的设备名称 -y:指定不显示第一次统计信息,即不显示自开机起的统计信息。 interval:刷新时间间隔 count:总统计次数
例如:
[root@xuexi ~]# iostat Linux 2.6.32-504.el6.x86_64 (xuexi.longshuai.com) 06/11/2017 _x86_64_ (4 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 0.01 0.00 0.03 0.01 0.00 99.96 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn sda 0.58 39.44 23.14 5557194 3259968 sdb 0.00 0.03 0.00 4256 0
各列的意义都很清晰,从字面便可理解。
sar是一个很是强大的性能分析工具,它能够获取系统的cpu/等待队列/磁盘IO/内存/网络等性能指标。
功能多的必然结果是选项多,应用复杂,但只要知道一些经常使用的选项足以。
sar [options] [-o filename] [delay [count] ] 选项说明: -A:显示系统全部资源运行情况 -b:显示磁盘IO和tranfer速率信息,和iostat的信息同样,是整体IO统计信息 -d:显示磁盘在刷新时间间隔内的活跃状况,能够指定一个或多个设备,和-b不一样的是,它显示的是单设备的IO、transfer信息。 :建议配合-p使用显示友好的设备名,不然默认显示带主次设备号的设备名 -P:显示指定的某颗或某几颗cpu的使用状况。指定方式为,-P 0,1,2,3或ALL。 -u:显示每颗cpu总体平均使用状况。-u和-P的区别经过下面的示例很容易区分。 -r:显示内存在刷新时间间隔内的使用状况 -n:显示网络运行状态。后可接DEV/NFS/NFSD/ALL等多种参数。 :DEV表示显示网路接口信息,NFS和NFSD分别表示显示NFS客户端服务端的流量信息,ALL表示显示全部信息。 -q:显示等待队列大小 -o filename:将结果存入到文件中 delay:状态刷新时间间隔 count:总共刷新几回
[root@server2 ~]# sar -P ALL 1 2 Linux 3.10.0-327.el7.x86_64 (server2.longshuai.com) 06/20/2017 _x86_64_ (4 CPU) 01:18:49 AM CPU %user %nice %system %iowait %steal %idle 01:18:50 AM all 0.00 0.00 0.25 0.00 0.00 99.75
01:18:50 AM 0 0.00 0.00 0.00 0.00 0.00 100.00
01:18:50 AM 1 0.00 0.00 0.00 0.00 0.00 100.00
01:18:50 AM 2 0.00 0.00 0.00 0.00 0.00 100.00
01:18:50 AM 3 0.00 0.00 0.00 0.00 0.00 100.00
01:18:50 AM CPU %user %nice %system %iowait %steal %idle 01:18:51 AM all 0.00 0.00 0.00 0.00 0.00 100.00
01:18:51 AM 0 0.00 0.00 0.00 0.00 0.00 100.00
01:18:51 AM 1 0.00 0.00 0.99 0.00 0.00 99.01
01:18:51 AM 2 0.00 0.00 0.00 0.00 0.00 100.00
01:18:51 AM 3 0.00 0.00 0.00 0.00 0.00 100.00 Average: CPU %user %nice %system %iowait %steal %idle Average: all 0.00 0.00 0.12 0.00 0.00 99.88 Average: 0 0.00 0.00 0.00 0.00 0.00 100.00 Average: 1 0.00 0.00 0.50 0.00 0.00 99.50 Average: 2 0.00 0.00 0.00 0.00 0.00 100.00 Average: 3 0.00 0.00 0.00 0.00 0.00 100.00
各列的意义就再也不赘述了,在前面几个信息查看命令已经解释过屡次了。
在上面的例子中,统计了全部cpu(0,1,2,3共4颗)每秒的状态信息,每秒还进行了一次汇总,即all,最后还对每颗cpu和汇总all计算了平均值。而咱们真正须要关注的是最后的average部分的idle值,idle越小,说明cpu处于空闲时间越少,该颗或总体cpu使用率就越高。
或者直接对总体进行统计。以下:
[root@server2 ~]# sar -u 1 2 Linux 3.10.0-327.el7.x86_64 (server2.longshuai.com) 06/20/2017 _x86_64_ (4 CPU) 01:18:37 AM CPU %user %nice %system %iowait %steal %idle 01:18:39 AM all 0.00 0.00 0.00 0.00 0.00 100.00
01:18:40 AM all 0.00 0.00 0.23 0.00 0.00 99.77 Average: all 0.00 0.00 0.12 0.00 0.00 99.88
其中kbdirty表示内存中脏页的大小,即内存中还有多少应该刷新到磁盘的数据。
第一种方法是查看/proc/net/dev文件。
关注列:receive和transmit分别表示收包和发包,关注每一个网卡的bytes便可得到网卡的状况。写一个脚本计算每秒的差值即为网络流量。
或者使用sar -n命令统计网卡接口的数据。
[root@server2 ~]# sar -n DEV 1 2 Linux 3.10.0-327.el7.x86_64 (server2.longshuai.com) 06/20/2017 _x86_64_ (4 CPU) 01:51:11 AM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s 01:51:12 AM eth0 0.00 0.00 0.00 0.00 0.00 0.00 0.00
01:51:12 AM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
01:51:12 AM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s 01:51:13 AM eth0 0.99 0.99 0.06 0.41 0.00 0.00 0.00
01:51:13 AM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 Average: IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s Average: eth0 0.50 0.50 0.03 0.21 0.00 0.00 0.00 Average: lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
各列的意义以下:
[root@server2 ~]# sar -q Linux 3.10.0-327.el7.x86_64 (server2.longshuai.com) 06/20/2017 _x86_64_ (4 CPU) 12:00:01 AM runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15 blocked 12:10:01 AM 0 446 0.01 0.02 0.05 0
12:20:01 AM 0 445 0.02 0.03 0.05 0
12:30:01 AM 0 446 0.00 0.01 0.05 0 Average: 0 446 0.01 0.02 0.05 0
每列意义解释:
[root@server2 ~]# sar -d -p 1 2 Linux 3.10.0-327.el7.x86_64 (server2.longshuai.com) 06/20/2017 _x86_64_ (4 CPU) 12:53:06 AM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 12:53:07 AM sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 12:53:07 AM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 12:53:08 AM sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 Average: DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util Average: sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
分别统计的是12:53:06到12:53:07和12:53:07到12:53:08这两秒的IO使用状况。
各列的意义以下:
free用于查看内存使用状况。CentOS 6和CentOS 7上显示格式不太同样。
free [options] 选项说明: -h:人类可读方式显式单位 -m:以MB为显示单位 -w:将buffers和cache分开单独显示。只对CentOS 7上有效 -s:动态查看内存信息时的刷新时间间隔 -c:一共要刷新多少次退出free
如下以CentOS 7上的free结果说明各列的意义。
[root@server2 ~]# free -m total used free shared buff/cache available Mem: 1824 131 1286 8 407 1511 Swap: 1999 0 1999
Mem和Swap分别表示物理内存和交换分区的使用状况。
因此available才是真正须要关注的可以使用内存空间量。
使用-w能够将buffers/cache分开显示。
[root@server2 ~]# free -w -m total used free shared buffers cache available Mem: 1824 131 1286 8 0 406 1511 Swap: 1999 0 1999
还能够动态统计内存信息,例如每秒统计一次,统计2次。
[root@server2 ~]# free -w -m -s 1 -c 2 total used free shared buffers cache available Mem: 1824 130 1287 8 0 406 1512 Swap: 1999 0 1999 total used free shared buffers cache available Mem: 1824 130 1287 8 0 406 1512 Swap: 1999 0 1999
如下是CentOS 6上的free结果。
[root@xuexi ~]# free -m total used free shared buffers cached Mem: 980 415 565 0 53 239
-/+ buffers/cache: 121 859 Swap: 1999 0 1999
在此结果中,"-/+ buffers/cache"的free列才是真正可用的内存空间了,即CentOS 7上的available列。
通常来讲,内存可用量的范围低于20%应该要引发注意了。