vmstat 命令详解
更新时间:2026-08-28。本文是「一个命令一个文档」系列,聚焦
vmstat(virtual memory statistics,虚拟内存统计)——性能观测与调试命令族(见性能观测命令族)。它和 top 互补:top 看进程,vmstat 看系统整体资源。
vmstat 一行输出就把系统的几大资源(进程、内存、swap、IO、CPU)全摆出来,是判断"瓶颈大概在哪"最快的命令。它不钻到某个进程里,而是给你一张系统级的"体检表"。
一、基本用法
vmstat # 打印一次快照(自启动以来的平均值)
vmstat 1 # 每 1 秒刷新一次(持续观察)
vmstat 1 5 # 每 1 秒一次,共 5 次第一次输出是"自启动以来的累计均值",参考价值低;加个间隔(如
vmstat 1)后,从第二行起才是真实间隔采样,看趋势要看后面那些行,别被第一行误导。
二、各列含义
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 823412 12345 362900 0 0 12 34 210 340 3 1 95 0 0| 区 | 列 | 含义 | 怎么判断 |
|---|---|---|---|
| procs | r | 运行+就绪的进程数 | 持续 > 核数 = CPU 不够,排队 |
| procs | b | 不可中断睡眠的进程数(通常等 IO) | 高 = 有进程卡在磁盘/网络 IO |
| memory | free/buff/cache | 空闲/缓冲/缓存内存 | 看整体内存压力 |
| swap | si/so | 换入/换出(KB/s) | 任一持续 >0 = 内存真不够,在换页 |
| io | bi/bo | 块设备读/写(块/s) | 高 = 磁盘 IO 忙 |
| system | in/cs | 中断/上下文切换次数 | cs 暴涨可能调度开销大 |
| cpu | us/sy/id/wa/st | 用户/系统/空闲/IO等待/被偷 | wa 高=等 IO;sy 高=内核忙 |
几个关键信号:
si/so(swap in/out)只要持续非零,说明物理内存已经不够、系统在被"换页"拖慢——这是内存瓶颈的铁证。r长期大于 CPU 核数说明计算资源饱和。wa(iowait)高配合b高,典型是磁盘成为瓶颈。st(steal)在虚拟机里高,说明宿主机在抢你的 CPU。
三、实战:判断瓶颈类型
vmstat 1
# 场景 A:r 高、us 高、si/so=0 → CPU 计算瓶颈(上 perf)
# 场景 B:b 高、wa 高、bi/bo 高 → 磁盘 IO 瓶颈(上 iostat)
# 场景 C:si/so 持续 >0、free 低 → 内存不足、在 swap(加内存或查吃内存的进程)
# 场景 D:cs 极高、sy 高 → 上下文切换过多(锁竞争/过多线程)vmstat 的价值就在"一秒定性":先知道瓶颈是 CPU、IO、内存还是切换,再决定掏出哪个工具深挖——CPU 用 perf,IO 用 iostat,内存看 free 和 top 找元凶。不要一上来就 perf,可能瓶颈根本不在 CPU。
四、和 top / iostat 的分工
| 工具 | 视角 |
|---|---|
vmstat | 系统级资源体检表,一秒定性瓶颈类型 |
| top | 进程级,谁在吃 CPU/内存(见 top) |
| iostat | 磁盘 IO 细节(见 iostat) |
| perf | CPU 热点函数(见 perf) |
标准排障链路:
vmstat 1看瓶颈类型 → 对应工具下钻。它是最被低估的"第一道筛子",很多人在 top 里看半天没头绪,其实 vmstat 一行就指明了方向。
一句话总结
vmstat = 系统级资源体检表:vmstat 1 看间隔采样(别信首行累计值);r>核数=CPU 饱和、b/wa 高=IO 瓶颈、si/so>0=内存不足在换页、cs 暴涨=切换开销大;一秒定性瓶颈类型后,再决定用 top/iostat/perf 下钻。它是性能排查最该先跑的"筛子"。