vmstat 是一个收集和报告系统内存,swap,处理器资源的工具,全称是 Virtual Meomory Statistics,虚拟内存统计,Linux 下监控内存经常使用的工具,可以对系统内存,CPU,进程进行监控。

vmstat reports information about processes, memory, paging, block IO, traps, disks and cpu activity.

使用

vmstat 的使用非常简单,直接运行

vmstat
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   9496 1632720 1179760 4628968    0    0     9    37   55   12  3  1 96  0  0

输出一大串数据,第一行数据 vmstat 会计算从开机到运行命令这一时刻之间记录的平均数据。此后的每一次都是时间间隔内的情况。

vmstat [delay] [count]

第一行会打印平均值,之后每隔 [delay] 的时间,打印一次报告,在打印 [count] 次之后停止。

输出值解释

Procs
   r: 显示多少进程在等待 CPU The number of runnable processes (running or waiting for run time).
   b: 显示多少进程正在进行不可终端的休眠,等待 IO(The number of processes in uninterruptible sleep)

Memory
   swpd: the amount of virtual memory used.
   free: the amount of idle memory.
   buff: the amount of memory used as buffers.
   cache: the amount of memory used as cache.
   inact: the amount of inactive memory.  (-a option)
   active: the amount of active memory.  (-a option)

Swap
   si: Amount of memory swapped in from disk (/s).
   so: Amount of memory swapped to disk (/s).

IO
   bi: Blocks received from a block device (blocks/s).
   bo: Blocks sent to a block device (blocks/s).

System
   in: 每秒中断数量 The number of interrupts per second, including the clock.
   cs: 每秒切换上下文次数 The number of context switches per second.

CPU
   These are percentages of total CPU time.
   us: 执行用户代码的时间 Time spent running non-kernel code.  (user time, including nice time)
   sy: 执行内核代码的时间 Time spent running kernel code.  (system time)
   id: Time spent idle.  Prior to Linux 2.5.41, this includes IO-wait time.
   wa: Time spent waiting for IO.  Prior to Linux 2.5.41, included in idle.
   st: Time stolen from a virtual machine.  Prior to Linux 2.6.11, unknown.

Example

使用 stress 命令进行测试,并对 vmstat 结果进行观察。先用一个终端打开 vmstat,然后在其他终端输入 stress 响应的命令观察。

CPU 密集型任务

使用 4 worker 进行处理任务 sqrt() :

stress -c 4 -t 30

可以立即看到 vmstat 结果中 r 列,立即会显示 >= 4 个任务在进行。

IO 密集型任务

使用 2 个 worker 进行 sync():

stress -i 2 -t 30

立即就能看到 IO 中 bibo 成倍上涨。

或者使用 -d 选项,读写 HDD

stress -d 2 -t 10

大量内存使用

使用 2 个工作 worker 进行 malloc()free(),占用 4G 内存 20 秒:

stress -m 2 --vm-bytes 256M -t 20

能看到 memory 中 free 下降,另外如果计算机内存比较小,千万慎重,如果要测试一定使用超时机制,否则可能直接卡死系统。

当系统内存不足时,有几种表现:

  • 在 Memory 列,free memory 减少,回收 buffer 和 cacher 也无济于事,大量使用交换分区(swpd), 页面交换(swap)频繁
  • IO 方面,读写磁盘数量(io)增多
  • 系统缺页中断(in)增多,上下文切换(cs)次数增多
  • 等待 IO 的进程数(b)增多,大量 CPU 时间用于等待 IO(wa)