以下介绍常用的几个系统分析的命令以及常用方法:
vmstat 是Virtual Meomory Statistics(虚拟内存统计)的缩写,很多Linux发行版本都默认安装了此命令工具。当然,不止对虚拟内存有统计,还可以利用vmstat命令可以对进程状态、CPU活动等进行监视,不足就是不能对某个进程跟踪分析。
vmstat 命令语法:
vmstat [-V] [-n] [delay [count]]
-V,显示当前版本
-n,表示循环输出信息时,头部信息只出现一次。
delay,两次输出之间的时间间隔
count,表示按照“delay”指定的时间间隔统计的次数,默认为1
[root@example.com ~]# vmstat 1 5
procs- -------------memory------------ ---swap-- -----io---- --system--- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 4852724 465532 19557332 0 0 3 33 0 0 3 0 97 0 0
0 0 0 4853232 465532 19557340 0 0 0 176 10946 11871 6 0 94 0 0
1 0 0 4852520 465532 19557824 0 0 0 0 11010 10857 6 1 93 0 0
1 0 0 4853360 465532 19557672 0 0 0 5112 11034 9379 9 1 90 0 0
3 0 0 4851908 465532 19558160 0 0 0 0 10934 9371 3 1 96 0 0
下面解释一下:
proce
r 表示运行和等待的cpu时间片的进程数,这个值如果长期大于系统cpu线程数,说明CPU不足。
b 表示等待资源的进程数,比如正在等待I/O或者内存交换等
memory
swpd 表示切换到内存交换区的内存大小(单位KB),实际分析是,以si、so为准。
free 当前空闲的内存数量
buff 表示buffers cache 的内存数量,一般对块设备的读写才需要缓冲。
cache page cached 的内存数量,一般作为文件系统进行缓存,,频繁访问的文件都会被缓存。如果cache值较大,说明缓存的文件数量较多,
如果此时io中的bi比较小,说明文件系统效率比较好。
swap
si 表示由磁盘调入内存。
so 表示有内存调入磁盘。
一般情况下,这两个值都为零
io
bi 从块设备读入数据的总量,既读磁盘,(KB/s)
bo 写入快设备的数据量,既写磁盘,(KB/s))
这里bi+bo 参考值为1000,如果超过1000,而且wa值比较大,则表示系统磁盘I/o有问题,考虑提升磁盘读写
system
in 某一时间间隔内,观测到的每秒设备中断数。
cs 列表表示每秒产生的上下文切换数。
上面这两个值越大,由内核消耗的CPU时间越多。
cpu
us显示用户进程消耗的cpu时间百分比。如果长期高于50%,需要考虑优化业务程序了。
sy显示内核进程消耗的cpu时间百分比。
us+sy 大于70% 说明cpu资源有些紧张了。
id显示cpu处于空闲的时间百分比。
wa显示io等待所占用cpu时间的百分比,wa参考值为20%,超过20%说明io等待已经很严重了。因此等待的
原因可能是磁盘大量随机读写,也可能是磁盘或者磁盘控制器的带宽瓶颈(主要是块级操作。)
综述可见,对cpu评估中,重点注意procs中r列,cpu中的us、sy、id列。
sar是分析系统性能的重要工具,用法如下:
sar [option] [-o filename] [interval] [count] ]
option(常用),
-A ,显示系统所有资源设备(内存,cpu,磁盘)的运行状况。
-u , 显示cpu在采样时间内的系统负载。
-P ,指定对机器的哪一个cpu进行采样。
-d ,显示系统硬盘在采样时间内的运行信息。
-r ,显示系统内存在采样时间内的使用状况。
-b ,显示缓冲区在采样时间内的使用情况。
-v ,显示进程、文件、节点和锁表状态。
-n ,显示网络运行状态,参数后面可跟DEV(显示网络接口信息)、EDEV(显示网络错误的统计数据)、SOCK(显示套接字信息)、和FULL(显示前三参数的所有信息)。
-q ,显示运行队列的大小,它与系统当时的平均浮在相同。
-R ,显示进程在采样时间内的活动情况。
-y , 显示终端设备在采样时间内的活动情况。
-w ,显示系统交换在采样时间内的活动情况。
-o filename 表示将输出结果以二进制形式输出到某个文件中。
interval ,表示采样间隔。
count , 表示采样次数,默认为1.
[@example.com ~]# sar -P 2 1 5
Linux 2.6.18-128.el5 (example.com) 2016年09月18日
21时38分24秒 CPU %user %nice %system %iowait %steal %idle
21时38分25秒 2 0.00 0.00 0.00 0.00 0.00 100.00
21时38分26秒 2 0.00 0.00 0.00 0.00 0.00 100.00
21时38分27秒 2 0.00 0.00 0.00 0.00 0.00 100.00
21时38分28秒 2 0.00 0.00 0.00 0.00 0.00 100.00
21时38分29秒 2 0.00 0.00 0.00 1.00 0.00 99.00
Average: 2 0.00 0.00 0.00 0.20 0.00 99.80
%user:用户进程消耗的cpu时间比例。
%nice:列显示运行正常进程所消耗cpu的时间比例。
%system:显示系统进程消耗的cpu时间比例。
%iowait:列显示了io等待所消耗的cpu时间。
%steal:表示在内存相对紧张的情况下,pagein强制对不同页面进行的steal处理。
%idle:列显示了cpu在空闲状态下的时间百分比。
最后一行的average是对上面内容求的平均值。
如上,可以指定某一个cpu,对其负载监控,这样可以结果有的程序做成了单线程,这样虽然cpu整体消耗不高,但是单线程就不行了
查看机器历史性能信息
sar -b -s 10:00:00 -e 16:00:00 -f /var/log/sa/sa10
-b 磁盘缓存的使用情况,
-s 开始时间,
-e结束时间,起始时间的格式都是:hh:mm:ss
-f 指定sar的历史日志,默认位置在/var/log/sa/目录下
[@example.com ~]# sar -b -s 10:00:00 -e 10:50:00 -f /var/log/sa/sa10
Linux 2.6.18-128.el5 (example.com) 2016年09月10日
10时00分01秒 tps rtps wtps bread/s bwrtn/s
10时10分01秒 13.83 0.12 13.71 1.63 1344.93
10时20分01秒 272.92 250.34 22.58 2011.54 1650.26
10时30分01秒 11.25 0.02 11.23 0.13 1118.80
10时40分01秒 11.87 0.01 11.86 0.11 1143.23
Average: 77.50 62.65 14.84 503.59 1314.32
iostat是i/o statistic的缩写,主要功能是对系统的磁盘io操作进行监视。不是linux默认安装的,需要安装一个开源的工具包sysstat,安装完毕会多出iostat、sar、mpstat三个命令。
iostat语法如下
iostat [-c|-d] [-k] [-t] [-x [device]] [interval[count] ]
-c 显示cpu的使用情况,显示的含义和sar的基本一致,不在用例说明。
-d 显示磁盘的使用情况
-k 每秒按照kb为单位显示
-t 打印出统计信息开始执行的时间。
-x device 指定要统计的磁盘设备,默认为所有磁盘设备。
interval,指定两次统计间隔的时间。
count,按照interval指定的时间间隔进行统计的次数。
[@example.com ~]# iostat -d 1 2
Linux 2.6.18-128.el5 (example.com) 2016年09月18日
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 8.65 34.40 569.09 886282530 14664213986
sda1 0.00 0.00 0.00 5991 2637
sda2 0.67 1.23 15.77 31779879 406401849
sda3 1.53 2.64 60.98 67940779 1571254746
sda4 0.00 0.00 0.00 6 0
sda5 1.40 1.48 277.72 38223426 7156219000
sda6 0.00 0.01 0.02 289718 555488
sda7 0.00 0.01 0.02 322742 530104
sda8 0.00 0.01 0.02 321038 530080
sda9 0.00 0.01 0.02 308854 532080
sda10 5.05 28.99 214.54 747089393 5528188002
sdb 1.33 46.39 588.21 1195318411 15156936736
sdb1 1.33 46.39 588.21 1195317483 15156936736
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 0.00 0.00 0.00 0 0
sda1 0.00 0.00 0.00 0 0
sda2 0.00 0.00 0.00 0 0
sda3 0.00 0.00 0.00 0 0
sda4 0.00 0.00 0.00 0 0
sda5 0.00 0.00 0.00 0 0
sda6 0.00 0.00 0.00 0 0
sda7 0.00 0.00 0.00 0 0
sda8 0.00 0.00 0.00 0 0
sda9 0.00 0.00 0.00 0 0
sda10 0.00 0.00 0.00 0 0
sdb 0.00 0.00 0.00 0 0
sdb1 0.00 0.00 0.00 0 0
Blk_read/s 表示每秒读取的数据块数
Blk_wrtn/s 表示每秒写的数据块数
Blk_read 表示读取的所有块数
Blk_wrtn 表示写入的所有块数
需要说明的,第一次输出的是系统自启动开始到统计时的所有传输信息,第二次输出的数据才代表在监测的时间段内系统的传输值。
可以通过Blk_read/s Blk_wrtn/s的数值表现做一下简要分析,比如Blk_read/s 长期居高不下,说明磁盘的读操作频繁,可以考虑将读取的数据放到内存中进行操作;
如果Blk_wrtn/s长期居高不下,说明磁盘写操作频繁,可以考虑优化磁盘(提升转速,使用raid等),或者优化程序(简化写的次数,优化写的信息的格式化等)。
[@example.com ~]# iostat -x /dev/sda2 2 3
Linux 2.6.18-128.el5 (example.com) 2016年09月19日
avg-cpu: %user %nice %system %iowait %steal %idle
1.94 0.00 1.78 0.32 0.00 95.96
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sda2 0.01 1.38 0.08 0.59 1.23 15.77 25.23 0.04 63.08 11.63 0.78
avg-cpu: %user %nice %system %iowait %steal %idle
0.00 0.00 0.12 0.00 0.00 99.88
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
avg-cpu: %user %nice %system %iowait %steal %idle
0.00 0.00 0.06 0.00 0.00 99.94
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
iostat -x 跟sar -u 和 -d 的内容基本一致
主要说一下:
rrqm/s 表示每秒进行合并的读操作数量
wrqm/s 表示每秒进行合并的写操作数量
r/s 每秒完成度i/o设备的次数
w/s 每秒完成写i/o设备的次数
rsec/s 每秒读取的扇区数
wsec/s 每秒写入的扇区数
[root@NJ-37-212 ~]# free -m
total used free shared buffers cached
Mem: 31994 27240 4753 0 441 17816
-/+ buffers/cache: 8983 23010
Swap: 16499 0 16499
大概解释一下:
total 系统识别的内存总数
used 系统当前已经使用的内存数
free 系统空闲的内存数
shared 多个进程共享的内存总额
buffers Buffer Cache和cached Page Cache 磁盘缓存的大小
-buffers/cache 的内存数:used - buffers - cached
+buffers/cache 的内存数:free + buffers + cached
这里需要说明,可用的memory=free memory+buffers+cached
free -s ,使用 -s参数,可以实现以指定时间间隔对内存进行不间断监控
[root@NJ-37-212 ~]# free -m -s 5
total used free shared buffers cached
Mem: 31994 27254 4739 0 441 17829
-/+ buffers/cache: 8984 23009
Swap: 16499 0 16499
total used free shared buffers cached
Mem: 31994 27255 4738 0 441 17830
-/+ buffers/cache: 8984 23009
Swap: 16499 0 16499
uptime输出信息:系统现在的时间,系统自上次开机到现在的运行时间,系统目前有多少用户登录,系统分别在1、5、15min的平均负载情况
[@example.com ~]# uptime
00:42:11 up 298 days, 6:31, 16 users, load average: 0.27, 0.67, 1.14
这里需要注意load average,这里的负载信息跟sar -q的记录的当前系统的任务队列长度的值一样,表示在采样时间内等待被处理的任务数,
通常情况下,这三个数不能大于系统的cpu逻辑核数,如果长期大于cpu逻辑核数,则会较严重影响系统性能。