Skip to content

vmstat 命令详解:一眼看穿 CPU、内存、磁盘 I/O 的实时状况 ​

本文是 Linux 命令速查 中 vmstat 的从 0 到 1 详解。 目标:把 vmstat --help 里的每个选项、以及输出每一列讲清楚,多看几遍后,你在服务器上敲 vmstat 就知道该盯哪几列。 环境依据:procps-ng 3.3.17(Ubuntu 22.04 自带;RHEL/Rocky 同属 procps-ng,用法一致)。

一、命令是干什么的 ​

vmstat(virtual memory statistics,虚拟内存统计)是一个一行命令同时汇报 CPU、内存、swap、磁盘 I/O、系统中断的轻量监控工具。它输出一行行数字,列很多,但每一列都对应一类系统健康指标。

  • 不带参数:打印一行"开机到现在的平均值";
  • 带 delay:每隔 delay 秒持续打印,第一行是开机以来的平均,后面每一行是距上一次的增量(最有诊断价值);
  • 带 delay count:采样 count 次后自动退出。

类比:vmstat 就像把"任务管理器里的 CPU 曲线、内存曲线、磁盘活动曲线"压缩成一行表格,每隔几秒刷一行,适合快速判断"系统现在到底卡在哪一类资源上"。

SRE 经典用法:vmstat 1 5,看 5 秒,重点看 r(等待运行的进程数)、wa(CPU 等磁盘的时间)、si/so(swap 换入换出)、us/sy/id。

二、命令语法 ​

bash
vmstat [选项]... [delay [count]]
  • [选项]:可选,控制显示哪些分区(活动内存、slab、磁盘等)和格式;
  • delay:可选,每隔多少秒采样一次;不写就只打印一行平均值;
  • count:可选,采样多少次;不写就一直刷到 Ctrl+C。

最简单的用法:

bash
vmstat 1 3

三、选项全表(对照 vmstat --help) ​

1. 控制显示哪类统计 ​

选项中文含义什么场景用
-a,--active显示 active/inactive(活跃/非活跃)内存想看哪些内存页是热的
-f,--forks显示开机以来 fork 出来的进程总数看进程创建总量
-m,--slabs打印 slab 分配器缓存信息排查内核内存碎片/slab 占用
-s,--stats打印各类事件计数器汇总看开机以来的累计统计
-d,--disk显示各磁盘的读写统计看磁盘吞吐
-D,--disk-sum磁盘统计汇总成一个总数不想按盘拆开时
-p 设备,--partition 设备显示指定分区的统计只盯某个分区

2. 控制输出格式 ​

选项中文含义什么场景用
-n,--one-header只打印一次表头,不重复显示持续刷新时输出更干净
-S 字符,--unit 字符指定显示单位(如 k/K/m/M)脚本里固定单位
-w,--wide宽列输出(数字更宽、不挤)列多的时候防错列
-t,--timestamp每行前面加上时间戳持续采样时标记时间点

四、由浅入深的典型示例 ​

示例 1:基本用法,每 1 秒采 2 次 ​

bash
vmstat 1 2
text
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 3310828  15712 4426424    0    0     1    20  341  548  1  1 98  1  0
 0  0      0 3307660  15712 4426436    0    0     0    76 2035 2827  2  1 97  0  0

第一行 0 0 ... 98 1 0 是开机以来的平均值,参考意义不大;从第二行开始才是这 1 秒内的实时增量,重点看第二行。

示例 2:读懂每一列 ​

输出按表头分五大块,逐块解释:

text
procs                memory                  swap        io         system       cpu
 r  b            swpd free buff cache     si   so    bi   bo    in   cs   us sy id wa st

procs(进程)块:

列含义怎么看
r等待 CPU 运行的进程数(运行队列)长期大于 CPU 核数,说明 CPU 不够用
b处于不可中断睡眠(通常在等磁盘)的进程数非 0 常说明磁盘 I/O 阻塞

memory(内存)块,单位 KB:

列含义
swpd已用掉的 swap 大小
free完全空闲的内存
buff块设备缓冲
cache页缓存

swap 块:

列含义怎么看
si每秒从磁盘换入内存的量(swap in)持续大于 0 说明内存吃紧,在频繁换入
so每秒从内存换出到磁盘的量(swap out)持续大于 0 说明在把内存数据挤到磁盘

si/so 长期不为 0 是内存不足的经典信号,比 free 的数字更敏感。

io 块:

列含义
bi每秒从块设备读入的块数(块默认 512B)
bo每秒写到块设备的块数

system(系统)块:

列含义
in每秒中断数
cs每秒上下文切换数

cs 飙升通常意味着进程/线程频繁切换,可能是锁竞争或线程太多。

cpu 块,单位是百分比:

列含义怎么看
us用户态占用(应用程序)高说明应用在算
sy内核态占用高说明系统调用/内核开销大
id空闲越高越闲
waCPU 空闲但在等磁盘 I/O高说明磁盘是瓶颈,不是 CPU
st被虚拟化偷走的时间云主机上 >0 说明宿主在争抢

示例 3:只打印一次表头,持续刷新 ​

bash
vmstat -n 1

每 1 秒打印一行、只在最上面显示一次表头,不会被反复出现的表头刷屏;按 Ctrl+C 停止。

示例 4:每行带时间戳 ​

bash
vmstat -t 1 5

每行前面追加当前时间,方便事后对照"几点几分系统开始抖动"。

示例 5:看 slab(内核缓存)占用 ​

bash
vmstat -m

输出内核 slab 分配器的各类缓存(如 dentry、inode、buffer_head)占用,排查"内存被内核吃掉但找不到进程用在哪"时用。

示例 6:看磁盘读写统计 ​

bash
vmstat -d

列出每个磁盘的读/写总数、合并次数等,轻量版的磁盘 IO 统计。

示例 7:看开机以来的事件汇总 ​

bash
vmstat -s

把"总共 fork 了多少进程、多少次中断、多少次上下文切换"等累计计数一次列出,适合做基线对比。

五、高频组合速记 ​

命令用途
vmstat 1 5采样 5 秒,看实时状况(最常用)
vmstat -n 1干净地持续刷新
vmstat -t 1 10带时间戳采样 10 秒
vmstat -m看内核 slab 占用
vmstat -d看磁盘读写总量

六、RHEL 系与 Debian 系差异 ​

vmstat 属于 procps-ng,两系用法一致。细微差别:

  • 输出列的顺序和含义两系相同;
  • 容器/虚拟机里 st(steal)列才有意义,物理机上通常是 0;
  • 若 swap 没配置,swpd/si/so 全为 0,属正常。

七、新手易错点 ​

  1. 盯着第一行平均值看:第一行是开机以来的平均,掩盖了当前抖动;一定要看第二行及以后的实时增量。
  2. 把 wa 当成 CPU 忙:wa 高恰恰是 CPU 在等磁盘,瓶颈在磁盘不在 CPU。
  3. si/so 偶尔为 0 就放心:要持续观察几秒;长期 si/so > 0 才是内存吃紧的信号。
  4. r 列超过 CPU 核数不代表报错:是提醒你 CPU 可能成为瓶颈,需要进一步用 mpstat -P ALL 看每核。
  5. vmstat 是只读命令,可放心使用:它只读 /proc 下的统计文件。
  6. 单位是 KB:memory 块默认 KB,别当成字节。

八、相关命令与文档 ​