vmstat 是什么
vmstat 把 CPU、内存、IO、上下文切换压进一行输出,是排查系统级瓶颈时最快的第一个命令。它的第一行是开机以来的平均值,从第二行开始才是按间隔采样的实时数据,分析必须从第二行看起。字段里最有价值的是 r(可运行队列)、si 与 so(换入换出)、bi 与 bo(块设备进出)以及 wa(CPU 等待 IO 的比例)。
基本信息
| 适用平台 | Linux 发行版通用,由 procps-ng 提供 |
|---|---|
| 命令语法 | vmstat [间隔 [次数]] |
| 常用选项 | -w 宽格式 / -s 累计统计 / -d 按设备的磁盘统计 / -p 按分区统计 / -S 指定单位 |
| 判读前提 | 先知道机器有几个核,r 才有比较基准 |
常用示例
常用示例
vmstat 1 10 # 每秒一行,共 10 行
vmstat -w 1 5 # 宽格式,列不易错位
vmstat -s | head # 累计统计摘要
vmstat -d | head # 按设备的磁盘统计
vmstat -p sda1 1 3 # 按分区的读写统计
nproc # 先看清核数,r 才有比较基准字段逐列读法
| 字段 | 含义 | 正常与异常 |
|---|---|---|
| r | 正在运行或等待 CPU 的进程数 | 持续大于核数说明 CPU 在排队 |
| b | 处于不可中断睡眠的进程数 | 长期大于 0 多与磁盘 IO 相关 |
| si / so | 从交换分区换入 / 换出的内存量 | 持续非零说明真在用 swap,性能会陡降 |
| bi / bo | 每秒从块设备读入 / 写出的块数 | 与 wa 一起看 |
| in | 每秒中断次数 | 突增可能来自网卡或设备风暴 |
| cs | 每秒上下文切换次数 | 结合 us 与 sy 判断,并非越高越坏 |
| us / sy / id / wa | 用户态、内核态、空闲、等待 IO 的 CPU 占比 | wa 持续偏高就去查磁盘 |
| st | 被虚拟机管理程序偷走的 CPU 时间 | 云主机上偏高说明宿主机存在资源争抢 |
判读顺序
- 先看 r 与核数的关系,判断是否存在 CPU 排队
- 再看 si 与 so 是否非零,排除换页导致的整体变慢
- 然后看 wa 与 bi、bo,把矛头指向磁盘
- 用 cs 与 in 区分正常高吞吐和异常风暴
- 云主机再看 st,宿主机争抢会表现为同样的服务变慢
第一行是开机以来的平均值,拿它做判断会把历史峰值当成现状;分析一律从第二行起,并且至少观察 5 到 10 个采样点再下结论。
cs 高本身不是问题,高吞吐服务天然会频繁切换线程;只有当 cs 升高、us 与 sy 也上升,吞吐却下降时,才说明切换开销成了负担。
常见组合用法
- 看短时抖动:vmstat 1 30,连续看半分钟再判断
- 长周期趋势交给 sar,vmstat 只负责现场快速判断
- 怀疑磁盘:先看 wa 与 b,再用 iostat 定位到具体设备
- 怀疑内存:先看 si 与 so,再用 ps 按内存排序找大户
- 对照基线:把健康时段的输出存档,异常时比对差异
si 与 so 是相对交换分区的统计,容器里若没有可见的 swap,这两个字段会一直是 0;排查容器内存压力要转看 /proc/meminfo 与 cgroup 的内存统计。
wa 高不等于磁盘坏了:备份任务、大文件顺序写、虚拟机快照都会推高 wa,先确认这些活动是否本来就在计划之中。
加 -w 使用宽格式会把列间距拉开,宽表在终端里不容易错位,复制到工单或聊天工具里也更好读。
采样次数要给足:vmstat 1 3 只有三行,很容易被某个瞬时峰值带偏;现场排查建议至少看 10 行以上,或者持续输出、看够再中断。
bi 与 bo 的单位是块,实际字节数取决于内核块大小。跨机器对比这两列时先换算到字节,否则容易得出相反结论。
判读顺序建议固定下来:先看运行队列与上下文切换判断 CPU 侧是否拥塞,再看交换与内存判断是否承受内存压力,最后看块设备等待判断存储是否拖慢整体。一次采样不足以定性,按固定间隔连续采几次再比较变化,结论才站得住。