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%,一切都正常了。

相关推荐