Linux系统监控工具之vmstat详解
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(defaultis 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 1010580641537678424718647109115137309700 [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 00107183771060010115136309700
字段说明:
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 14 procs -----------memory-------------swap-------io------system-------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 00105807395128781367077271010114837209700 001058073951207813670772000053550010000 001058073951207813670772000047590010000 001058073951207813670772000036550010000 [root@BJYF-7~]#free total used free shared buffers cached Mem:8059684664556739512807813670772 -/+ buffers/cache:5156487544036 Swap:6143992105806133412
注意:我们在这里发现一个小bug,vmstat第一次显示的结果往往会不准确,需要看第二、三次的结果
3.2 高CPU使用情况的vmstat输出
[root@BJYF-7~]#vmstat 14 procs -----------memory-------------swap-------io------system-------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 2010580543632878344718647109114937309700 20105805436344783447186400002027571000000 20105805436360783447186400082027651000000 20105805436360783447186400002024551000000
和上面对照可以明显的发现,运行队列为2,内存空闲区域减少,中断数值较大,CPU中的user%使用率是100%。
3.3 高CPU和内存使用情况的vmstat输出
[root@BJYF-7-38 tmp]#vmstat 14 procs -----------memory-------------swap-------io------system-------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 1841619441098762524600174392760017652276041628929161329430 0941588801046842524552582405526858240552684595257810140770 874110180923442524732986045554098604555404890518917180651 184161664105228252464859272110972592721109728996255110260650
从输出结果来看,处在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 14 procs -----------memory-------------swap-------io------system-------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 801071212088430410128961851911886542536113800 801071212088430410128000020056741000000 801071212088430410128000020096751000000 801071212088430410128000020056781000000
升级以后,swap使用1G左右,但swap换入换出基本为0,wait%为0,user%为100%,一切都正常了。