vmstat 是 Linux 上经典的系统性能观测工具,用于查看进程调度、内存、Swap、块设备 I/O、系统中断和 CPU 状态。它不负责直接给出“哪个进程有问题”,但很适合用作故障现场的第一眼体检工具。

快速开始

最常用的命令是:

1
vmstat 1

表示每 1 秒输出一次,直到按 Ctrl+C 停止。若只想每 2 秒采样一次、共输出 5 次:

1
vmstat 2 5

典型输出如下:

1
2
3
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 0 82348 12000 922000 0 0 10 20 500 1000 5 2 92 1 0

不带 -y 时,第一行数据是系统自启动以来的平均值,不能代表当前这一秒。观察实时趋势时可以忽略第一行,或直接执行 vmstat -y 1

六组核心指标

1. procs:进程调度

字段 含义 关注点
r 正在运行或等待 CPU 的可运行进程数 持续高于逻辑 CPU 数量,说明 CPU 运行队列存在压力
b 处于不可中断睡眠的进程数 持续升高时,通常需要排查 I/O 或其他内核等待

先用 nproc 查看逻辑 CPU 数量,再判断 r 是否长期过高。不要用固定的 r > 3r > 5 判断所有机器:4 核和 64 核机器的基线完全不同。

1
nproc

2. memory:内存

字段 含义
swpd 已使用的 Swap 空间
free 完全空闲的内存
buff 用作 buffer 的内存
cache 用作 page cache 的内存
inact 非活跃内存,仅在 -a 模式显示
active 活跃内存,仅在 -a 模式显示

free 很小不等于内存不足。Linux 会利用空闲内存做缓存,判断内存压力时应结合 siso,并使用 free -h 查看 available

1
2
free -h
vmstat -a 1

3. swap:换页活动

字段 含义
si 每秒从 Swap 换入内存的数据量
so 每秒从内存换出到 Swap 的数据量

swpd 非零只表示已有页面位于 Swap,并不说明当前仍有内存压力。如果 siso 持续较高,才说明系统正在频繁换页,应用延迟通常也会随之上升。

4. io:块设备 I/O

字段 含义
bi 每秒从块设备接收的块数
bo 每秒发送到块设备的块数

vmstat 只能反映整机 I/O 活动,无法定位具体磁盘,也不能仅凭 bibo 判断磁盘是否饱和。进一步分析应使用:

1
iostat -x 1

重点关注目标设备的吞吐、IOPS、await%util,并结合设备类型与业务基线判断。

5. system:中断与上下文切换

字段 含义
in 每秒中断次数,包括时钟中断
cs 每秒上下文切换次数

incs 没有适用于所有机器的固定阈值,应观察它们是否相对历史基线突增。cs 异常升高时,可继续排查大量线程或进程竞争、高频网络请求、锁竞争以及频繁唤醒。

6. cpu:CPU 时间分布

字段 含义
us 用户态 CPU 时间占比
sy 内核态 CPU 时间占比
id CPU 空闲时间占比
wa CPU 等待 I/O 的时间占比
st 虚拟机等待宿主机分配 CPU 的时间占比

可以简记为:

1
2
3
4
us = 应用程序在计算
sy = 内核在工作
wa = CPU 在等待 I/O
st = 虚拟机想运行,但物理 CPU 时间被宿主机占用

例如:

1
2
us sy id wa st
90 5 5 0 0

表示 CPU 主要用于运行用户程序,整体已接近打满。如果是:

1
2
us sy id wa st
10 5 20 65 0

则大量 CPU 时间消耗在等待 I/O,应转向存储链路排查。wa 高只是线索,不等于已经证明磁盘饱和。

在 KVM、云主机等虚拟化环境中还要特别关注 st

1
2
us sy id wa st
20 5 20 0 55

st=55% 表示虚拟机有大量时间等待 Hypervisor 调度物理 CPU,常见原因包括宿主机 CPU 超分、物理 CPU 竞争或调度压力。

常用参数

命令 用途
vmstat 1 每秒持续采样
vmstat 2 5 每 2 秒采样一次,共 5 次
vmstat -y 1 跳过“自系统启动以来”的第一行统计
vmstat -w 1 使用更宽的列宽显示
vmstat -a 1 显示 active/inactive 内存
vmstat -S M 1 以 MiB 显示受单位参数影响的字段
vmstat -s 显示内存和系统事件汇总
vmstat -d 显示磁盘统计

不同发行版所带的 procps-ng 版本可能支持不同参数,可用 vmstat --helpman vmstat 核对当前系统。

实际排障思路

执行 vmstat -y 1 后,先看 rbsi/sous/sy/id/wa/st,再按以下模式缩小范围:

现象 初步判断 下一步
r 持续高、us 应用消耗大量 CPU mpstat -P ALL 1pidstat -u 1
r 持续高、sy 内核态开销较高 检查 syscall、网络、中断、锁竞争
b 高、wa 存在 I/O 或内核等待 iostat -x 1、检查 D 状态进程
si/so 持续高 内存压力和频繁换页 free -hpidstat -r 1
st 虚拟机受到宿主机 CPU 竞争影响 检查 Hypervisor 的 CPU 超分与调度

常用的组合命令是:

1
2
3
4
vmstat -y 1
iostat -x 1
mpstat -P ALL 1
pidstat 1

vmstat 负责判断问题大致落在 CPU、内存还是 I/O;mpstat 继续拆分到 CPU 核,iostat 拆分到块设备,pidstat 再定位到具体进程。

参考资料