vmstat是一个查看虚拟内存(Virtual Memory)使用状况的工具,使用vmstat命令可以得到关于进程、内存、内存分页、堵塞IO、traps及CPU活动的信息。
vmstat是一个十分有用的Linux系统监控工具,是procps组件的一部分。
一、前言
很显然从名字中我们就可以知道vmstat是一个查看虚拟内存(Virtual Memory)使用状况的工具,但是怎样通过vmstat来发现系统中的瓶颈呢?在回答这个问题前,还是让我们回顾一下Linux中关于虚拟内存相关内容。
虚拟内存运行原理
在系统中运行的每个进程都需要使用到内存,但不是每个进程都需要每时每刻使用系统分配的内存空间。当系统运行所需内存超过实际的物理内存,内核会释 放某些进程所占用但未使用的部分或所有物理内存,将这部分资料存储在磁盘上直到进程下一次调用,并将释放出的内存提供给有需要的进程使用。
在Linux内存管理中,主要是通过“调页Paging”和“交换Swapping”来完成上述的内存调度。
调页算法是将内存中最近不常使用的页面换到磁盘上,把活动页面保留在内存中供进程使用。
交换技术是将整个进程,而不是部分页面,全部交换到磁盘上。
二、vmstat的使用
2.1.用法
[root@BJYF-7 ~]#vmstat --help
usage: vmstat [-V] [-n] [delay [count]]
-V prints version.显示vmstat版本信息.
-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.显示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.次数.
2.2 使用说明
[root@BJYF-7 ~]#vmstat 1
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 10580 6415376 78424 71864 7 10 9 11 51 37 3 0 97 0 0
[root@BJYF-7 ~]#vmstat -S M
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 10 7183 77 106 0 0 10 11 51 36 3 0 97 0 0
字段说明:
Procs(进程)
r: 运行队列中进程数量
b: 等待IO的进程数量
Memory(内存)
swpd: 使用虚拟内存大小
free: 可用内存大小
buff: 用作缓冲的内存大小
cache: 用作缓存的内存大小
Swap
si: 每秒从磁盘写到虚拟内存的大小
so: 每秒写入磁盘的虚拟内存大小
IO
bi: 块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte。
bo: 块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。
系统
in: 每秒中断数,包括时钟中断。
cs: 每秒上下文切换数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数 目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者 线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空 间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。
CPU
us: 用户进程执行时间(user time)
sy: 系统进程执行时间(system time)
id: 空闲时间(包括IO等待时间)
wa: 等待IO时间
三、案例演示
3.1 空负载状态下vmstat的输出
[root@BJYF-7 ~]#vmstat 1 4
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 10580 7395128 78136 70772 7 10 10 11 48 37 2 0 97 0 0
0 0 10580 7395120 78136 70772 0 0 0 0 53 55 0 0 100 0 0
0 0 10580 7395120 78136 70772 0 0 0 0 47 59 0 0 100 0 0
0 0 10580 7395120 78136 70772 0 0 0 0 36 55 0 0 100 0 0
[root@BJYF-7 ~]#free
total used free shared buffers cached
Mem: 8059684 664556 7395128 0 78136 70772
-/+ buffers/cache: 515648 7544036
Swap: 6143992 10580 6133412
注意:我们在这里发现一个小bug,vmstat第一次显示的结果往往会不准确,需要看第二、三次的结果
3.2 高CPU使用情况的vmstat输出
[root@BJYF-7 ~]#vmstat 1 4
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 10580 5436328 78344 71864 7 10 9 11 49 37 3 0 97 0 0
2 0 10580 5436344 78344 71864 0 0 0 0 2027 57 100 0 0 0 0
2 0 10580 5436360 78344 71864 0 0 0 8 2027 65 100 0 0 0 0
2 0 10580 5436360 78344 71864 0 0 0 0 2024 55 100 0 0 0 0
和上面对照可以明显的发现,运行队列为2,内存空闲区域减少,中断数值较大,CPU中的user%使用率是100%。
3.3 高CPU和内存使用情况的vmstat输出
[root@BJYF-7-38 tmp]#vmstat 1 4
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 8 4161944 109876 252 4600 17439 27600 17652 27604 1628 929 16 13 29 43 0
0 9 4158880 104684 252 4552 58240 55268 58240 55268 4595 2578 10 14 0 77 0
8 7 4110180 92344 252 4732 98604 55540 98604 55540 4890 5189 17 18 0 65 1
1 8 4161664 105228 252 4648 59272 110972 59272 110972 8996 2551 10 26 0 65 0
从输出结果来看,处在block阻塞状态等待IO操作的数量在8左右,swap使用4G,几乎80%,剩余物理内存100M左右,swap换入换出在60M每秒,中断和上下文次数较多,CPU中user%为20%,wait%为70%。
此时通过top来看,CPU占用最多的进程为系统的kswapd0。iostat查看磁盘使用率100%。
由此推断,swap交换过于频繁,导致IO使用率100%,过多的进程处在阻塞状态,工作效率极低。
而之所以产生很多的swap交换,很可能是因为内存不足造成的。需要升级内存。
内存升到8G以后,在此运行相同的测试程序结果如下:
[root@BJYF-7-38 tmp]#vmstat 1 4
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
8 0 10712 120884 304 10128 96 185 191 188 654 253 61 1 38 0 0
8 0 10712 120884 304 10128 0 0 0 0 2005 674 100 0 0 0 0
8 0 10712 120884 304 10128 0 0 0 0 2009 675 100 0 0 0 0
8 0 10712 120884 304 10128 0 0 0 0 2005 678 100 0 0 0 0
升级以后,swap使用1G左右,但swap换入换出基本为0,wait%为0,user%为100%,一切都正常了。
参考文章
http://blog.csdn.net/xifeijian/article/details/8209788
本站之前的文章:Linux学习笔记之vmstat
转载请注明:IPCPU-网络之路 » Linux系统监控工具之vmstat详解