Linux vmstat命令--监控CPU 性能分析

top是给Linux设计的。在FreeBSD VM里面的Free概念和其他OS完全不同,使用top查看Free内存对于FreeBSD来说可以说没什么意义。正确的方法是看vmstat。

vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写, 是实时系统监控工具。该命令通过使用knlist子程序和/dev/kmen伪设备驱动器访问这些数据,输出信息直接打印在屏幕。vmstat反馈的与CPU相关的信息包括:
(1)多少任务在运行
(2)CPU使用的情况
(3)CPU收到多少中断
(4)发生多少上下文切换

使用方法:

一般vmstat工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数,如:

root@ubuntu:~# vmstat 2 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 0 3498472 315836 3819540 0 0 0 1 2 0 0 0 100 0

2表示每个两秒采集一次服务器状态,1表示只采集一次。

Linux下vmstat输出释疑:

 Vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 100152 2436 97200 289740 0 1 34 45 99 33 0 0 99 0

procs
r 列表示运行和等待cpu时间片的进程数,如果长期大于1,说明cpu不足,需要增加cpu。当这个值超过了CPU数目,就会出现CPU瓶颈了。
b 列表示在等待资源的进程数,比如正在等待I/O、或者内存交换等。
cpu 表示cpu的使用状态
us 列显示了用户方式下所花费 CPU 时间的百分比。us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期大于50%,需要考虑优化用户的程序。
sy 列显示了内核进程所花费的cpu时间的百分比。这里us + sy的参考值为80%,如果us+sy 大于 80%说明可能存在CPU不足。系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。
wa 列显示了IO等待所占用的CPU时间的百分比。这里wa的参考值为30%,如果wa超过30%,说明IO等待严重,这可能是磁盘大量随机访问造成的,也可能磁盘或者磁盘访问控制器的带宽瓶颈造成的(主要是块操作)。 
id 列显示了cpu处在空闲状态的时间百分比。空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。
system 显示采集间隔内发生的中断数
in 列表示在某一时间间隔中观测到的每秒设备中断数。
cs列表示每秒产生的上下文切换次数,如当 cs 比磁盘 I/O 和网络信息包速率高得多,都应进行进一步调查。每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。
memory
swpd 切换到内存交换区的内存数量(k表示)。如果swpd的值不为0,或者比较大,比如超过了100m,只要si、so的值长期为0,系统性能还是正常。否则,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。
free 当前的空闲页面列表中内存数量(k表示) 
buff 作为buffer cache的内存数量,一般对块设备的读写才需要缓冲。 
cache: 作为page cache的内存数量,一般作为文件系统的cache,如果cache较大,说明用到cache的文件较多,如果此时IO中bi比较小,说明文件系统效率比较好。 
swap
si 由内存进入内存交换区数量。
so由内存交换区进入内存数量。 
IO
bi 从块设备读入数据的总量(读磁盘)(每秒kb)。
bo 块设备写入数据的总量(写磁盘)(每秒kb)
这里我们设置的bi+bo参考值为1000,如果超过1000,而且wa值较大应该考虑均衡磁盘负载,可以结合iostat输出来分析。


Solairs系统下vmstat输出释疑

vmstat 5 5
linux_unix_vmstat

kthr
r 列, 表示在运行队列中等待的进程数。
b 列, 表示在等待资源的进程数,比如正在等待I/O、或者内存交换等。
w 列, 表示可以进入运行队列但被交换出来的进程

 
cpu 表示cpu的使用状态
us 列, 显示了用户方式下所花费 CPU 时间的百分比。一个 UNIX 进程可以在用户方式下执行,也可以在系统(内核)方式下执行。当在用户方式下时,进程在它自己的应用程序代码中执行,不需要内核资源来进行计算、管理内存或设置变量。
sy 列, 详述了 CPU 在系统方式下执行一个进程所花时间的百分比。这包括内核进程(kprocs)和其它需要访问内核资源的进程所消耗的 CPU 资源。如果一个进程需要内核资源,它必须执行一个系统调用,并由此切换到系统方式从而使该资源可用。例如,对一个文件的读或写操作需要内核资源来打开文件、寻找特定的位置,以及读或写数据,除非使用内存映射文件。这里us + sy的参考值为80%,如果us+sy 大于 80%说明可能存在CPU不足。
id 列, 显示了没有未决本地磁盘 I/O 时 CPU 空闲或等待的时间百分比。


faults 显示采集间隔内发生的中断数
in 列, 表示在某一时间间隔中观测到的每秒设备中断数。iostat命令输出更有参考意义。
sy 列, 表示在某一时间间隔中观测到的每秒系统调用次数。通过明确的系统调用,用户进程可以使用资源。这些调用指示内核执行调用线程的操作,并在内核和该进程之间交换数据。因为工作负载和应用程序变化很大,不同的调用执行不同的功能,所以不可能定义每秒钟有多少系统调用才算太多。这里设置参考值为10000,超过10000,用户需要注意。
cs 列, 表示,如当 cs 比磁盘 I/O 和网络信息包速率高得多,都应进行进一步调查。


memory
swap 列, 当前可用内存交换区容量(k表示)。
free 列, 当前的空闲页面列表中内存数量(k表示)


page
re 列, 表示回收的页面数。
mf 列, 表示小级别错误计数。
pi 列, 表示进入页面数 (k表示)。
po 列, 表示出页面数(k表示)。
fr 列, 表示空余的页面数(k表示)。
de 列, 表示提前读入的页面中的未命中数。
sr 列, 表示通过时钟算法扫描的页面计数

 

disk,    显示每秒的磁盘操作。 s表示scsi盘,0表示盘号
s1列,

sd列,

sd列,

--列,

解释:
  如果 r经常大于 4 ,且id经常少于40,表示cpu的负荷很重。
  如果pi,po 长期不等于0,表示内存不足。
  如果disk 经常不等于0, 且在 b中的队列 大于3, 表示 io性能不好。

 

AIX下vmstat释疑:

# vmstat 5 20
kthr memory page faults cpu
----- ----------- ------------------------ ------------ -----------
r b avm fre re pi po fr sr cy in sy cs us sy id wa
1 1 244528 1227 0 3 3 56 151 0 404 1420 1415 4 2 88 6
2 6 244538 1241 0 39 148 2424 3511 0 904 4660 7571 49 12 2 38
5 3 244540 791 0 2 221 3937 6077 0 1183 6605 24619 44 34 1 21
1 7 245326 1009 0 11 331 1071 1934 0 884 3788 13000 23 25 0 52

分析如下:
kthr
kthr列表示每秒钟在采样间隔时间上对各种队列中的内核线程数求得的平均值

r 列表示可运行的内核线程平均数,包括正在运行的线程和正在等待 CPU的线程。如果这个数字大于 CPU 的数目,至少有一个线程要等待 CPU,等待 CPU 的线程越多,越有可能对性能产生影响。


b 列表示每秒 VMM 等待队列中的内核线程平均数。这包括正在等待文件系统 I/O 的线程,或由于内存装入控制而暂挂的线程。这里参考值为2,大于2表示被阻塞列线程数目太多。 
[b] !阻塞线程数目太多
CPU
us 列显示了用户方式下所花费 CPU 时间的百分比。一个 UNIX 进程可以在用户方式下执行,也可以在系统(内核)方式下执行。当在用户方式下时,进程在它自己的应用程序代码中执行,不需要内核资源来进行计算、管理内存或设置变量。
sy 列详述了 CPU 在系统方式下执行一个进程所花时间的百分比。这包括内核进程(kprocs)和其它需要访问内核资源的进程所消耗的 CPU 资源。如果一个进程需要内核资源,它必须执行一个系统调用,并由此切换到系统方式从而使该资源可用。例如,对一个文件的读或写操作需要内核资源来打开文件、寻找特定的位置,以及读或写数据,除非使用内存映射文件。这里us + sy的参考值为80%,如果us+sy 大于 80%说明可能存在CPU不足。
id 列显示了没有未决本地磁盘 I/O 时 CPU 空闲或等待的时间百分比。
wa 列详细显示了暂挂本地磁盘 I/O 和 NFS 加载的磁盘的 CPU 空闲百分比。这里参考值为25%,大于25% 可能表示磁盘子系统可能没有被正确平衡,或者这也可能是磁盘密集工作负载的结果。 
[us]+[sy] !IO不平衡
[wa] 正常
fault
in 列表示在某一时间间隔中观测到的每秒设备中断数。iostat命令输出更有参考意义。
sy 列表示在某一时间间隔中观测到的每秒系统调用次数。通过明确的系统调用,用户进程可以使用资源。这些调用指示内核执行调用线程的操作,并在内核和该进程之间交换数据。因为工作负载和应用程序变化很大,不同的调用执行不同的功能,所以不可能定义每秒钟有多少系统调用才算太多。这里设置参考值为10000,超过10000,用户需要注意。
cs 列表示,如当 cs 比磁盘 I/O 和网络信息包速率高得多,都应进行进一步调查。
[sy] 正常
memory
avm 列表示在收集 vmstat 样本时存在的活动虚拟内存页面数(4k为单位)。理想情况下, avm 应该比总 RAM 数小。如果不是,可能会出现一些虚拟内存页面调度量。有多少页面调度发生取决于两个值之间的差值。记住,虚拟内存的概念是提供给我们寻址大于实内存容量的能力(一些在 RAM 内存中,而另一些在调页空间中)。但是如果虚拟内存远大于实内存,可能造成过度的页面调度,从而导致延时。如果 avm 小于 RAM,那么当 RAM 中填满文件页时就会引起调页空间的页面调度。这种情况下,调整 minperm、maxperm 和 maxclient 的值可以减少调页空间的页面调度量。
fre 列显示出空闲内存页面的平均数量(4k为单位)。VMM 在空闲列表上保存的最少页面数由 minfree 参数决定。这里的参考值为maxfree的缺省值720,小于720说明存在内存系统颠簸。 
[fre] 正常
[avm] avm的值约为:958MB
page
pi 列详细描述了从调页空间调入的页数。调页空间是驻留在磁盘上的虚拟内存的一部分。当内存过量使用时,它用作溢出。调页空间由用于存储从实内存中窃取到的工作组页面的逻辑卷组成。当进程访问一个窃取页时,产生了一个缺页故障,这一页必须从调页空间读入内存。这里设置pi的参考值为5,大于5说明内存不足。
po 列显示了调出到调页空间的页面数(速率)。无论什么时候窃取工作存储器的一页,如果它仍未驻留在调页空间中或已被修改,那它会被写入调页空间。如果不被再次访问,它会留在页面调度设备中直到进程终止或放弃空间。如果包含在出故障页面中的后续地址引用导致缺页故障,那么这些页面将会由系统个别调进。当一个进程正常终止,任何分配给该进程的调页空间将被释放。
fr 列表示在一定时间间隔内根据页面替换算法每秒所释放的页数。当 VMM 页面替换例程扫描页面帧表(Page Frame Table,PFT)时,它使用一些条件选取要窃取的页面以插入到可用内存帧的空闲列表中。
sr 列表示在一定时间间隔内根据页面替换算法每秒所检查的页面数。页面替换算法在可以窃取足够的页面以满足页面替换线程的需要之前可能不得不扫描许多页面帧。
cy 列表示每秒页面替换代码扫描了 PFT 多少次。因为插入空闲列表可以不需要完全扫描 PFT,并且因为所有的 vmstat 字段报告为整数,这一字段通常为 0。
这里设置fr:sr的参考值为3,超过说明内存不足。 
[pi] !存在内存不足
[fr:sr] 正常

 

Hp-UNIX 命令vmstat释疑

# vmstat 5 5
procs memory page faults cpu
r b w avm free re at pi po fr de sr in sy cs us sy id
2 0 0 52260 24324 9 4 0 0 0 0 1 109 427 81 2 1 97
2 0 0 52260 24285 0 0 0 0 0 0 0 110 207 90 0 0 99
1 0 0 56211 24285 0 0 0 0 0 0 0 106 192 80 0 0 100
1 0 0 56211 24285 0 0 0 0 0 0 0 107 152 76 0 0 100
2 0 0 56552 24285 0 0 0 0 0 0 0 106 154 72 0 0 100

分析结果
procs
r 列表示在运行队列中等待的进程数。
b 列表示在等待资源的进程数,比如正在等待I/O、或者内存交换等。
w 列表示可以进入运行队列但被交换出来的进程 。
[b] 正常
cpu 表示cpu的使用状态
us 列显示了用户方式下所花费 CPU 时间的百分比。一个 UNIX 进程可以在用户方式下执行,也可以在系统(内核)方式下执行。当在用户方式下时,进程在它自己的应用程序代码中执行,不需要内核资源来进行计算、管理内存或设置变量。
sy 列详述了 CPU 在系统方式下执行一个进程所花时间的百分比。这包括内核进程(kprocs)和其它需要访问内核资源的进程所消耗的 CPU 资源。如果一个进程需要内核资源,它必须执行一个系统调用,并由此切换到系统方式从而使该资源可用。例如,对一个文件的读或写操作需要内核资源来打开文件、寻找特定的位置,以及读或写数据,除非使用内存映射文件。这里us + sy的参考值为80%,如果us+sy 大于 80%说明可能存在CPU不足。
id 列显示了没有未决本地磁盘 I/O 时 CPU 空闲或等待的时间百分比。 
[us]+[sy] 正常
fault 显示采集间隔内发生的中断数
in 列表示在某一时间间隔中观测到的每秒设备中断数。iostat命令输出更有参考意义。
sy 列表示在某一时间间隔中观测到的每秒系统调用次数。通过明确的系统调用,用户进程可以使用资源。这些调用指示内核执行调用线程的操作,并在内核和该进程之间交换数据。因为工作负载和应用程序变化很大,不同的调用执行不同的功能,所以不可能定义每秒钟有多少系统调用才算太多。这里设置参考值为10000,超过10000,用户需要注意。
cs 列表示,如当 cs 比磁盘 I/O 和网络信息包速率高得多,都应进行进一步调查。 
[sy] 正常
memory
avm 当前激活的虚拟内存数量(k表示)。
free 当前的空闲页面列表中内存数量(k表示) 
[free] 正常
page
re 列表示回收的页面数。
at 列表示地址翻译错误计数。
pi 列表示进入页面数 (k表示)。
po 列表示出页面数(k表示)。
fr 列表示空余的页面数(k表示)。
de 列表示提前读入的页面中的未命中数。
sr 列表示通过时钟算法扫描的页面计数 
[po] 正常
[fr:sr] 正常

 

示例分析:

示例1:

# vmstat 2
kthr     memory             page              faults        cpu
----- ----------- ------------------------ ------------ -----------
  r  b  avm    fre     re  pi  po  fr   sr  cy  in   sy    cs  us sy  id wa
  1  0 22478  1677   0   0   0   0    0   0 188 1380 157 57 32  0 10
  1  0 22506  1609   0   0   0   0    0   0 214 1476 186 48 37  0 16
  0  0 22498  1582   0   0   0   0    0   0 248 1470 226 55 36  0  9

  2  0 22534  1465   0   0   0   0    0   0 238  903 239 77 23  0  0
  2  0 22534  1445   0   0   0   0    0   0 209 1142 205 72 28  0  0
  2  0 22534  1426   0   0   0   0    0   0 189 1220 212 74 26  0  0
  3  0 22534  1410   0   0   0   0    0   0 255 1704 268 70 30  0  0
  2  1 22557  1365   0   0   0   0    0   0 383  977 216 72 28  0  0

  2  0 22541  1356   0   0   0   0    0   0 237 1418 209 63 33  0  4
  1  0 22524  1350   0   0   0   0    0   0 241 1348 179 52 32  0 16
  1  0 22546  1293   0   0   0   0    0   0 217 1473 180 51 35  0 14

此输出显示了在一个死循环中将程序引入到一个繁忙的多用户系统中所带来的效果。头三个报告(已删除摘要)表明系统平衡在 50-55% 的用户、30-35% 的系统和 10-15% 的 I/O 等待处。当循环程序开始运行,所有可用的 CPU 周期都被耗用。因为循环程序不进行 I/O,所以它可以占有前面因为 I/O 等待而未用过的所有周期。更糟的是,这代表当一个有用进程放弃 CPU 时,始终有一个进程准备接管 CPU。因为循环程序的优先级与所有其他前台进程一样,所以当另一个进程变得可分派时它也没必要一定得放弃 CPU。该程序运行大约 10 秒钟(五个报告),然后由 vmstat 命令报告的活动恢复到较正常的模式。

最佳利用是让 CPU 在 100% 的时间中工作。这适用于单用户系统的情况,不需要共享 CPU。总的来说,如果 us + sy 时间低于 90%,则不认为单用户系统是 CPU 受限制的。但是,如果在一个多用户系统中 us + sy 时间超过 80%,则进程可能要花时间在运行队列中等待。响应时间和吞吐量会受损害

要检查 CPU 是否是瓶颈,考虑 vmstat 报告中的四个 cpu 列和两个 kthr(内核线程)列。

超过 25% 的 wa 的值可以表示磁盘子系统可能没有被正确平衡,或者这也可能是磁盘密集工作负载的结果。

 

示例2:FreeBSD vmstat详解(附例子)

 # vmstat
  procs memory page disk faults cpu
  r b w avm fre flt re pi po fr sr ad0 in sy cs us sy id
  0 2 1 270512 20316 30 0 0 0 26 5 1223 1589 98 593 1 1 99

最好使用vmstat t [n]命令,例如 vmstat 5 10,表示在t(5)秒时间内进行n(10)次采样。如果只使用vmstat,无法反映真正的系统情况。

procs:
r-->在运行的进程数
  b-->在等待io的进程数(等待i/o,paging等等)
  w-->可以进入运行队列但被替换的进程
memoy(以kb为单位,包括虚拟内核和真实内存,正在运行或最近20秒在运行的进程所用的虚拟内存将被视为active)
  avm-->活动的虚拟内存
  free-->空闲的内存
pages(统计错误页和活动页,每5秒平均一下,以秒为单位给出数值)
  flt-->错误页总数
  re-->回收的页面
  pi-->进入页面数
  po-->出页面数
  fr-->空余的页面数
  sr-->每秒通过时钟算法扫描的页面
disk 显示每秒的磁盘操作(磁盘名字的前两个字母加数字,默认只显示两个磁盘,如果有多的,可以加-n来增加数字或在命令行下把磁盘名都填上。)

fault 显示每秒的中断数
  in-->设备中断
  sy-->系统中断
  cs-->cpu交换(上下文切换)
cpu 表示cpu的使用状态
  cs-->用户进程使用的时间
  sy-->系统进程使用的时间
  id-->cpu空闲的时间

如果 r经常大于 4 ,且id经常少于40,表示cpu的负荷很重。
如果pi,po 长期不等于0,表示内存不足。
如果disk 经常不等于0, 且在 b中的队列 大于3, 表示 io性能不好。

以下是一个繁忙批量插入MySQL数据(大概每隔20秒可以插入50万多条数据)的vmstat例子:

复制代码
 procs      memory      page                    disks     faults         cpu
r b w avm fre flt re pi po fr sr da0 da1 in sy cs us sy id
1 0 63 23302M 803M 845 0 0 0 0 0 0 0 17 124 499 6 0 94
1 0 63 23302M 796M 837 0 0 0 2 0 1 0 18 158 505 6 0 94
1 0 63 23302M 790M 833 0 0 0 6 0 76 0 159 143 910 6 0 94
1 0 63 23302M 784M 868 0 0 0 16 0 8 0 34 156 550 6 0 94
2 0 63 23456M 709M 8317 2 0 0 2383 0 95 0 295 5504 1930 8 1 91
1 0 63 21975M 1281M 18909 3 0 0 94840 0 620 0 1893 64333 7822 10 4 87
1 0 63 21975M 1281M 415 0 0 0 342 0 1 0 29 611 566 6 0 94
1 0 63 22093M 978M 43503 0 0 0 5140 0 2187 0 4225 582 16279 6 2 92
复制代码

 循环插入到了后面,随着表越来越大,系统调用和上下文切换越来越频繁:

复制代码
 procs      memory      page                    disks     faults         cpu
r b w avm fre flt re pi po fr sr da0 da1 in sy cs us sy id
1 0 63 23233M 536M 28219 0 0 0 352 51252 869 0 1864 14542 11015 2 3 95
1 0 63 23349M 834M 12457 0 0 0 4 51247 2078 0 3945 179 14926 6 2 92
2 0 63 27343M 3130M 9295 0 0 0 2708 0 2 0 73 6988 1377 7 1 92
....中间比较正常,因为插入时间比较久
1 0 63 28788M 2934M 25760 0 0 0 5860 0 620 8 5529 42712 12924 11 2 86
0 0 63 25963M 3081M 4379 0 0 0 24049 0 3445 15 11274 97350 31798 2 7 91
0 0 63 33689M 1801M 388 0 0 0 4492 0 4403 15 8780 135421 35502 2 5 93
复制代码

不熟悉mysql内部机制,但是很明显,随着表越来越大,表插入速度越来越慢,因为系统调用和上下文切换越来越频繁了,浪费了很多CPU时间。
到了mysql表里有六千万多条数据时,每插入五十万条记录,已经要耗时100s,整个mysql数据库变得很繁忙,一些几万数据的插入也慢慢不能及时处理。

以下是一个拷贝4G文件到远程NFS的vmstat例子:

复制代码
 procs      memory      page                    disks     faults         cpu
r b w avm fre flt re pi po fr sr da0 da1 in sy cs us sy id
2 0 63 19731M 2400M 24415 0 0 0 70077 0 14 0 591 3915 1770 12 1 87
0 0 63 16352M 3594M 443 0 0 0 154948 0 2471 0 5067 17602 19448 1 2 96
0 0 63 16352M 3594M 0 0 0 0 0 0 772 0 1590 134 6577 0 0 100
0 0 63 16352M 3594M 0 0 0 0 0 0 856 0 1750 164 7135 0 0 100
0 0 63 16361M 3594M 1112 0 0 0 1030 0 400 0 815 1248 3620 0 0 100
0 0 63 16361M 3594M 0 0 0 0 0 0 0 0 15 116 488 0 0 100
0 0 63 16352M 3594M 329 0 0 0 352 0 2186 0 4275 595 15809 0 2 98
0 0 63 16352M 3594M 0 0 0 0 0 0 270 0 532 134 3186 0 0 100
0 0 63 16352M 3594M 0 0 0 0 0 0 185 0 368 164 2062 0 0 100
复制代码

 

最后稳定下来,状态良好的vmstat例子:

 procs      memory      page                    disks     faults         cpu
r b w avm fre flt re pi po fr sr da0 da1 in sy cs us sy id
0 0 63 16292M 3564M 0 0 0 0 0 0 0 0 12 142 472 0 0 100

 

posted on 2016-10-30 11:41  duanxz  阅读(10416)  评论(0编辑  收藏  举报