linux系统性能监视命令
preface
as a linux engineer,you should know how to use these command of monitor system,so let's learn these commands.
vmstat
如有问题,请与我联系,18500777133@sina.cn
vmstat是由procps包安装后命令,它是Virtual Memory Statistics(虚拟内存统计)的缩写。利用vmstat命令,我们可以对linux操作系统的内存,进程状态,CPU活动等进行监视,不足之处就是无法对某个进程进行深入分析。
命令使用如下:
[root@localhost ~]# vmstat -h
usage: vmstat [-V] [-n] [delay [count]]
-V prints version. # 打印详情
-n causes the headers not to be reprinted regularly. # 在周期内规律循环输出
-a print inactive/active page stats. # 打印活动和非活动的页信息
-d prints disk statistics # 打印磁盘统计信息
-D prints disk table # 打印磁盘表
-p prints disk partition statistics # 打印磁盘分区统计信息
-s prints vm table # 打印虚拟内存表
-m prints slabinfo #打印缓存信息
-t add timestamp to output # 添加时间戳在输出结果
-S unit size # 单元大小
delay is the delay between updates in seconds. #每两次输出的间隔信息
unit size k:1000 K:1024 m:1000000 M:1048576 (default is K)
count is the number of updates. # 按照delay指定的时间间隔统计的次数,默认为1
下面来看个例子:
[root@localhost ~]# vmstat 2 3
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 111688 76144 199116 0 0 3 4 32 55 0 0 100 0 0
0 0 0 111656 76144 199116 0 0 0 0 25 33 0 0 100 0 0
0 0 0 111656 76144 199116 0 0 0 16 24 32 0 0 100 0 0
- procs
- r表示运行和等待CPU时间片的进程数,这个值如果长期大于系统CPU的个数,说明CPU不足,需要增加CPU
- b表示在等待资源的进程数,比如正在等待I/O或者内存交换等。
- memory
- swpd列表示切换到内存交换分区的内存大小(以KB作为单位)。如果swpd的值不为0,或者 比较大,只要si、so的值长期为0,这种情况一般不用担心了,不会影响系统性能。
- free列表示当前空闲的物理内存数量(以KB为单位)
- buff列表示buffers cache的内存数量,一般为块设备的读写才需要缓冲。
- cache列表示page cached的内存数量,一般为文件系统进行缓存,频繁访问的文件都会被缓存。如果cache值比较大,说明缓存的文件数比较多,如果此时的IO中的bi比较小,说明文件系统效率比较好。
- swap
- si 表示由磁盘写入内存,也就是内存进入内存交换分区的内存大小。
- so表示内存调入磁盘,也就是内存交换分区进入RAM的内存大小。
一般情况下,si so的值都为0,如果si so长期不为0,说明系统RAM不足了,需要增加物理内存。
- io
表示磁盘读写情况
- bi表示从块设备读入数据的总量(即读磁盘),单位是kb/s。
- bo表示写入数据到磁盘,单位同上。
这里设置的bi+bo参考值为1000,如果超过1000,而且CPU列的wa(wait)值比较大,则表示系统磁盘I/O有问题,应该考虑提高磁盘的读写性能。
- system
显示采集间隔发生的中断数
- in表示在某一时间间隔内观测到的每秒设备中断数。
- cs(content switch)表示每秒产生的上下文切换次数。
上面两个值越大,由内核消耗的CPU时间越多。
- cpu
- us表示用户进程消耗CPU的时间百分比,us的值比较高的时候,说明用户进程消耗的CPU时间多,但是如果长期大于50%,就需要考虑优化程序和算法了。
- sy列显示了内核进程消耗的CPU时间百分比,sy值比较高时,说明内核消耗的CPU资源很多。
根据经验,us+uy的参考值为80%,如果us+sy大于80%,说明可能存在CPU资源不足。 - id表示CPU空闲状态的百分比
- wa列显示了IO等待所占用的CPU时间百分比。wa值越高,说明I/O等待越严重。根据经验,wa的参考值为20%,如果wa超过20%,说明IO等待严重,引起IO等待的原因可能是磁盘大量随机读写造成的。也可能是磁盘或者磁盘控制器的带宽瓶颈(主要是块操作)造成的。
综上所说的,在对CPU评估中,需要重点注意procs像中的r列的值和CPU项中us、sy和id列的值。
sar
sar是由sysstat包安装而成的,也是分析系统性能的重要工具,可以全面获取系统CPU,运行队列,磁盘I/O,分页(交换分区),内存,CPU中断,网络等性能数据。
命令如下:
[root@localhost ~]# sar --help
Usage: sar [ options ] [ <interval> [ <count> ] ]
Options are:
[ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -h ] [ -m ] [ -p ] [ -q ] [ -r ] [ -R ]
[ -S ] [ -t ] [ -u [ ALL ] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]
[ -I { <int> [,...] | SUM | ALL | XALL } ] [ -P { <cpu> [,...] | ALL } ]
[ -j { ID | LABEL | PATH | UUID | ... } ] [ -n { <keyword> [,...] | ALL } ]
[ -o [ <filename> ] | -f [ <filename> ] ] [ --legacy ]
[ -i <interval> ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]
参数解释:
- -A显示系统所有的资源设备(cpu,内存,磁盘)等运行状况。
- -u显示系统所有CPU在采样时间内的负载状态。
- -P显示当前系统中指定CPU的使用情况。
- -d显示系统所有硬盘设备在采样时间内的使用情况。
- -r显示内存在采用时间的使用情况
- -b显示缓冲区在采用时间的使用情况
- -v显示进程,文件,节点和锁表状态
- -n 显示网络运行状态。参数后面可以跟DEV,EDEV,sock和full。dev显示网络接口信息,Edev显示网络错误的统计数据,sock显示套接字信息,full显示前三参数的所有信息。他们可以单独使用或者一起使用。
- q显示运行队列的大小,它与系统当时的平均负载相同。
- -R显示进程在采用时间内的活动情况
- -y显示终端设备在采用时间的使用情况
- -w显示系统交换活动在采用时间的使用情况
- -o filename 表示将命令结果以二进制格式存放在文件中,filename是文件名
- interval表示采样间隔,是必须有的参数。
- count表示采用次数,可选参数,默认值为1
命令使用:
每一列的参数输出都写的很详细了,所以不做赘述。
[root@localhost ~]# sar -p 2 3 # 采集CPU信息,2秒采集一次,共三次
[root@localhost ~]# sar -w 1 3 #采集系统交换活动在采用时间的使用情况 ,1秒采集一次,共三次
[root@localhost ~]# sar -d 1 3 # 采集系统所有硬盘设备在采样时间内的使用情况。
[root@localhost ~]# sar -r 1 3 #显示内存在采用时间的使用情况,1秒采集一次,共三次
[root@localhost ~]# sar -n DEV 1 3 # 显示网络接口信息,每1秒采集一次,共采集3次
以前在蓝厂上班的时候遇到过这样的情况,系统负载不高,但是squid响应非常慢,找了一会儿发现squid只跑在了一个CPU核心上,这个核心使用率已经100%了,但是因为一个CPU核心使用率高,其他的核心低,所以导致sys load不高,这个时候,我们就要单独查看一个核心的使用率了,可以用到下面的命令:
我的是虚拟机,只分配了有一个1个CPU
[root@localhost ~]# sar -P 1 1 3 # 只有一个cpu,显示不了
Linux 2.6.32-504.el6.x86_64 (localhost.localdomain) 11/17/2016 _x86_64_ (1 CPU)
03:57:55 PM CPU %user %nice %system %iowait %steal %idle
[root@localhost ~]# sar -P 0 1 3 # 监视cpu 第0个核心的使用率。
Linux 2.6.32-504.el6.x86_64 (localhost.localdomain) 11/17/2016 _x86_64_ (1 CPU)
03:58:00 PM CPU %user %nice %system %iowait %steal %idle
03:58:01 PM 0 0.00 0.00 4.04 0.00 0.00 95.96
03:58:02 PM 0 0.00 0.00 3.03 0.00 0.00 96.97
03:58:03 PM 0 0.00 0.00 5.00 0.00 0.00 95.00
Average: 0 0.00 0.00 4.03 0.00 0.00 95.97
iostat
iostat 是安装sysstat后才有的命令,它是对系统磁盘IO操作进行监视的。它的输出主要是磁盘读写操作的统计信息,同事给出CPU的情况。和vmstat一样,只能监视系统整体情况,不能够对单个进程做分析。
[root@localhost ~]# iostat -help
Usage: iostat [ options ] [ <interval> [ <count> ] ]
Options are:
[ -c ] [ -d ] [ -N ] [ -n ] [ -h ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -y ] [ -z ]
[ -j { ID | LABEL | PATH | UUID | ... } [ <device> [...] | ALL ] ]
[ <device> [...] | ALL ] [ -p [ <device> [,...] | ALL ] ]
- -c 显示CPU情况
- -d 显示磁盘的使用情况
- -k 显示每秒以KB为单位显示数据
- -t 打印出统计信息开始执行的时间
- -x device指定要统计时间的磁盘设备名称,默认为所有的磁盘设备。
- interval 采集时间间隔
- count 次数
常用的命令组合如下:
[root@localhost ~]# iostat -d 1 3
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 0.49 6.12 8.84 392498 566882
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 0.00 0.00 0.00 0 0
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 0.00 0.00 0.00 0 0
上面每项输出的解释:
- Blk_read/s 表示每秒读取的数据块数
- Blk_write/s 表示每秒吸入的数据块数
- Blk_read 表示读取的所有块数
- Blk_wrtn表示写入的所有块数。
要注意的是,上面输出的第一项是从系统启动到统计时的所有传输信息,这个第二次输出的数据才代表在检测的时间段内系统的传输值。
[root@localhost ~]# iostat -x /dev/sda 1 2
Linux 2.6.32-504.el6.x86_64 (localhost.localdomain) 11/17/2016 _x86_64_ (1 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.03 0.00 0.15 0.12 0.00 99.70
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sda 0.09 0.76 0.14 0.35 6.08 8.82 30.70 0.00 8.01 3.65 0.18
avg-cpu: %user %nice %system %iowait %steal %idle
0.00 0.00 0.99 0.00 0.00 99.01
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
参数解释
- rrqm/s 表示每秒进行合并的读操作数目
- wrqm/s 表示每秒进行合并的写操作数目
- r/s 表示每秒完成读I/O的设备次数
- w/s 表示每秒完成写I/O的设备次数
- rsec/s 表示每秒读取的扇区数
- wsec/s 表示每秒写入的扇区数。
uptime
着重点说说sys load,
[root@localhost ~]# uptime
17:08:49 up 18:45, 1 user, load average: 0.00, 0.00, 0.00
这个load average有3个值输出,这个的负载不超过你当前CPU核心数即可,,像我这里的虚拟机有1个CPU,1核心,所以不超过1就行了。偶尔超过下不影响性能。
top
top命令不做赘述了,输出的结果非常详细,每一列也做了说明在输出结果的列表里面。