vmstat 是 Linux 上经典的系统性能观测工具,用于查看进程调度、内存、Swap、块设备 I/O、系统中断和 CPU 状态。它不负责直接给出“哪个进程有问题”,但很适合用作故障现场的第一眼体检工具。
快速开始
最常用的命令是:
1 | vmstat 1 |
表示每 1 秒输出一次,直到按 Ctrl+C 停止。若只想每 2 秒采样一次、共输出 5 次:
1 | vmstat 2 5 |
典型输出如下:
1 | procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- |
不带
-y时,第一行数据是系统自启动以来的平均值,不能代表当前这一秒。观察实时趋势时可以忽略第一行,或直接执行vmstat -y 1。
六组核心指标
1. procs:进程调度
| 字段 | 含义 | 关注点 |
|---|---|---|
r |
正在运行或等待 CPU 的可运行进程数 | 持续高于逻辑 CPU 数量,说明 CPU 运行队列存在压力 |
b |
处于不可中断睡眠的进程数 | 持续升高时,通常需要排查 I/O 或其他内核等待 |
先用 nproc 查看逻辑 CPU 数量,再判断 r 是否长期过高。不要用固定的 r > 3 或 r > 5 判断所有机器:4 核和 64 核机器的基线完全不同。
1 | nproc |
2. memory:内存
| 字段 | 含义 |
|---|---|
swpd |
已使用的 Swap 空间 |
free |
完全空闲的内存 |
buff |
用作 buffer 的内存 |
cache |
用作 page cache 的内存 |
inact |
非活跃内存,仅在 -a 模式显示 |
active |
活跃内存,仅在 -a 模式显示 |
free 很小不等于内存不足。Linux 会利用空闲内存做缓存,判断内存压力时应结合 si、so,并使用 free -h 查看 available。
1 | free -h |
3. swap:换页活动
| 字段 | 含义 |
|---|---|
si |
每秒从 Swap 换入内存的数据量 |
so |
每秒从内存换出到 Swap 的数据量 |
swpd 非零只表示已有页面位于 Swap,并不说明当前仍有内存压力。如果 si、so 持续较高,才说明系统正在频繁换页,应用延迟通常也会随之上升。
4. io:块设备 I/O
| 字段 | 含义 |
|---|---|
bi |
每秒从块设备接收的块数 |
bo |
每秒发送到块设备的块数 |
vmstat 只能反映整机 I/O 活动,无法定位具体磁盘,也不能仅凭 bi、bo 判断磁盘是否饱和。进一步分析应使用:
1 | iostat -x 1 |
重点关注目标设备的吞吐、IOPS、await 和 %util,并结合设备类型与业务基线判断。
5. system:中断与上下文切换
| 字段 | 含义 |
|---|---|
in |
每秒中断次数,包括时钟中断 |
cs |
每秒上下文切换次数 |
in、cs 没有适用于所有机器的固定阈值,应观察它们是否相对历史基线突增。cs 异常升高时,可继续排查大量线程或进程竞争、高频网络请求、锁竞争以及频繁唤醒。
6. cpu:CPU 时间分布
| 字段 | 含义 |
|---|---|
us |
用户态 CPU 时间占比 |
sy |
内核态 CPU 时间占比 |
id |
CPU 空闲时间占比 |
wa |
CPU 等待 I/O 的时间占比 |
st |
虚拟机等待宿主机分配 CPU 的时间占比 |
可以简记为:
1 | us = 应用程序在计算 |
例如:
1 | us sy id wa st |
表示 CPU 主要用于运行用户程序,整体已接近打满。如果是:
1 | us sy id wa st |
则大量 CPU 时间消耗在等待 I/O,应转向存储链路排查。wa 高只是线索,不等于已经证明磁盘饱和。
在 KVM、云主机等虚拟化环境中还要特别关注 st:
1 | us sy id wa st |
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 --help 和 man vmstat 核对当前系统。
实际排障思路
执行 vmstat -y 1 后,先看 r、b、si/so 和 us/sy/id/wa/st,再按以下模式缩小范围:
| 现象 | 初步判断 | 下一步 |
|---|---|---|
r 持续高、us 高 |
应用消耗大量 CPU | mpstat -P ALL 1、pidstat -u 1 |
r 持续高、sy 高 |
内核态开销较高 | 检查 syscall、网络、中断、锁竞争 |
b 高、wa 高 |
存在 I/O 或内核等待 | iostat -x 1、检查 D 状态进程 |
si/so 持续高 |
内存压力和频繁换页 | free -h、pidstat -r 1 |
st 高 |
虚拟机受到宿主机 CPU 竞争影响 | 检查 Hypervisor 的 CPU 超分与调度 |
常用的组合命令是:
1 | vmstat -y 1 |
vmstat 负责判断问题大致落在 CPU、内存还是 I/O;mpstat 继续拆分到 CPU 核,iostat 拆分到块设备,pidstat 再定位到具体进程。