vmstat(Virtual Memory Statistics)是一个轻量级的系统监控工具,能在一行中同时报告 CPU、内存、I/O 和系统整体负载情况。它非常适合用来快速判断系统当前是否存在内存压力、I/O 瓶颈或 CPU 争用。
1. 基本用法
直接执行 vmstat 会打印一次自开机以来的平均值,通常使用带间隔参数的形式来持续观察:
vmstat 2 5 # 每 2 秒输出一次,共输出 5 次后退出
vmstat 2 # 每 2 秒输出一次,直到手动停止
输出示例如下:
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 0 823456 102340 4567890 0 0 12 3 120 250 5 2 92 1 0
2. 关键字段解读
vmstat 的输出按列分组,每组对应一个子系统:
procs(进程)
r:处于运行队列的进程数(正在使用 CPU 或等待 CPU)。若长期超过 CPU 核心数,说明 CPU 是瓶颈。b:处于不可中断睡眠的进程数(通常是在等待 I/O)。数值持续偏高说明磁盘或网络 I/O 响应慢。
memory(内存,单位 KB)
free:完全未被使用的内存。不要只看这个数字趋近于零就认为内存不足,因为 Linux 会用未用内存做缓存。buff:用作块设备缓冲区的内存(如文件系统元数据)。cache:用作文件数据缓存的内存(Page Cache)。这部分内存可在应用需要时快速回收,实际可用内存应为free + buff + cache。
swap(交换分区)
si(swap in):每秒从磁盘读入交换区的数据量(KB/s)。so(swap out):每秒写出到磁盘交换区的数据量(KB/s)。
如果 si 和 so 持续大于 0,通常意味着物理内存不足,系统正在频繁换页(即“颠簸”),性能会急剧下降。
io(块设备 I/O,单位 KB/s)
bi(block in):每秒从块设备读入的块数。bo(block out):每秒写入块设备的块数。
注意,这里的块大小不确定,通常与文件系统块大小相关,但可以直观反映磁盘 I/O 的活跃程度。
system(中断与上下文切换)
in(interrupts):每秒中断次数,包括硬件中断(网卡、磁盘)和软件中断。cs(context switches):每秒上下文切换次数。过高(如几万以上)可能意味着大量线程或进程频繁切换,需要结合procs字段分析。
cpu(CPU 时间分配,百分比)
us(user):用户空间进程的 CPU 使用率。sy(system):内核空间(系统调用、内核线程)的 CPU 使用率。id(idle):CPU 空闲率。wa(wait):CPU 因为等待 I/O 完成而空闲的百分比。st(steal):虚拟机被宿主机“偷走”的 CPU 时间(虚拟化环境下特有意义,若持续较高说明宿主机 CPU 超分严重)。
3. 实用场景与技巧
- 快速判断系统是否流畅
看 r 是否长期大于 CPU 核数,b 是否持续大于 0,wa 是否偏高,si/so 是否有持续数值。一个健康的系统通常 r 较低、b=0、wa < 5、so=0。
- 定位性能瓶颈
若 b 高且 wa 同时升高,瓶颈很可能在磁盘 I/O;若 r 高而 wa 低,瓶颈在 CPU;若 so 经常大于 0,说明内存不足,需要加内存或减小应用内存占用。
- 配合其他命令使用
vmstat 提供的是系统总体快照,当发现异常时,可以进一步用 top、iostat、pidstat 等工具定位具体进程或设备。
- 利用额外选项获得更详细信息
vmstat -s:显示自开机以来的各种内存统计总量(如总内存、缓冲区、缓存等)。vmstat -d:显示各个磁盘的读写统计。vmstat -p /dev/sda1:显示指定分区的读写统计。
由于 vmstat 默认输出是数字列,很适合被脚本或监控系统直接解析,也可以直接重定向到日志进行事后分析。它虽然简陋,但因为它极低的开销和跨所有 Linux 发行版的标准存在,是系统管理员工具箱中不可或缺的“第一道诊断”工具。