vmstat 是 Virtual Memory Statistics(虚拟内存统计)的缩写,它是一个强大的工具,用于报告关于进程、内存、分页、块 I/O、陷阱和 CPU 活动的摘要信息。

基本语法和选项
vmstat 命令的基本语法如下:
vmstat [options] [delay [count]]
参数说明:
[delay]: 两次报告之间的时间间隔(以秒为单位),如果指定了延迟,vmstat将会持续地生成报告,直到你按下Ctrl+C。[count]: 报告的次数,如果指定了delay和count,vmstat将会生成指定次数的报告,然后退出,如果只指定了delay,它会无限运行。
常用选项:
-a或--active: 显示活跃和非活跃内存,这对于理解内存的真实使用情况非常有帮助。-s或 --: 显示事件计数器和内存的统计摘要,而不是报告平均值。-m或 --slabs: 显示 slab 信息,Slab 是 Linux 内核中用于管理频繁分配和释放的小对象的一种内存管理机制。-d或 --disk: 显示磁盘统计信息。-p或 --partition: 显示特定分区的磁盘统计信息。-S或 --unit:CHAR: 指定显示的单位。S表示 KB,k表示 1024 字节,m表示 MB。-t或 --timestamp: 在每一行报告前显示时间戳。
输出字段详解
vmstat 的输出分为几个部分,我们逐一解析。

1 默认输出(不带任何参数)
当你直接输入 vmstat 时,它会显示系统自启动以来的平均值。
$ vmstat 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 41812 80108 394836 0 0 10 8 10 18 1 1 97 0 0
procs (进程) 部分:
r: 运行队列中正在等待运行的进程数,这是衡量系统负载的关键指标,如果这个值持续大于 CPU 的核心数,说明系统可能过载。b: 等待 I/O 操作(如磁盘读写)的进程数,如果这个值很高,说明系统可能在等待 I/O,可能是磁盘瓶颈。
memory (内存) 部分:
swpd: 使用的虚拟内存(交换空间)总量,单位为 KB,如果这个值不为零,说明系统已经开始使用交换空间了。free: 空闲的内存总量,单位为 KB。buff: 用于缓冲区的内存总量,单位为 KB,这些内存用于文件系统元数据等。cache: 用于页缓存的内存总量,单位为 KB,这是 Linux 用来缓存文件数据的内存,可以显著提高文件读取速度。
swap (交换) 部分:

si: 从磁盘交换到内存的数据量(Swap In),单位为 KB/s,这个值通常应该接近于 0。so: 从内存交换到磁盘的数据量(Swap Out),单位为 KB/s,这个值通常也应该接近于 0。si和so持续很高,说明物理内存严重不足,系统正在频繁地进行换页,这会严重影响性能。
io (输入/输出) 部分:
bi: 从块设备(如磁盘)读取的数据量,单位为 块/s,通常指块设备。bo: 写入到块设备的数据量,单位为 块/s,这两个值可以帮助你判断磁盘 I/O 是否繁忙。
system (系统) 部分:
in: 每秒发生的“中断”次数,包括时钟中断。cs: 每秒发生的“上下文切换”次数,当 CPU 需要从一个进程切换到另一个进程时就会发生上下文切换,频繁的上下文切换(每秒上万次)可能意味着系统负载过高。
cpu (CPU) 部分:
us: 用户空间占用 CPU 的百分比,执行用户程序(如你的应用程序)所花费的时间。sy: 内核空间占用 CPU 的百分比,执行内核系统调用所花费的时间。id: CPU 空闲的百分比。wa: 等待 I/O 操作所花费的 CPU 时间百分比,如果这个值很高,说明 CPU 在等待磁盘。st: 虚拟机被 Hypervisor(虚拟机监视器)偷走的 CPU 时间百分比(Steal Time),这个值只在虚拟机中才有意义,表示宿主机将 CPU 资源分配给了其他虚拟机。
实际使用示例
示例 1:每 2 秒刷新一次,共刷新 5 次
$ vmstat 2 5 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 41812 80108 394836 0 0 10 8 10 18 1 1 97 0 0 0 0 0 41788 80108 394848 0 0 0 0 103 125 0 0 100 0 0 0 0 0 41788 80108 394848 0 0 0 0 103 126 0 0 100 0 0 0 0 0 41788 80108 394848 0 0 0 0 103 125 0 0 100 0 0 0 0 0 41788 80108 394848 0 0 0 0 103 126 0 0 100 0 0 0 0 0 41788 80108 394848 0 0 0 0 103 125 0 0 100 0 0
这个命令会显示 5 行数据,每 2 秒更新一次,让你看到系统资源的实时变化。
示例 2:显示活跃和非活跃内存
$ vmstat -a procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free inact active si so bi bo in cs us sy id wa st 1 0 0 41812 108040 323360 0 0 10 8 10 18 1 1 97 0 0
inact: 非活跃内存,近期很少被使用。active: 活跃内存,近期被频繁使用。inact+active≈buff+cache+free(在vmstat -a中,free通常是真正的空闲内存),这个视图能更准确地反映哪些内存正在被使用。
示例 3:显示内存统计摘要
$ vmstat -s
1239868 K total memory
418120 K free memory
80108 K used memory
394836 K active memory
108040 K inactive memory
1239868 K kernel memory
0 K swap cache
1239868 K total swap
1239868 K free swap
0 K used swap
...
这个输出以列表形式展示了更详细的内存统计信息,非常适合用于脚本或深入分析。
如何解读 vmstat 的结果(性能分析)
-
CPU 瓶颈:
- 查看
cpu列。us+sy接近 100%,而id持续很低,说明 CPU 正在满负荷工作。 us很高,说明是用户程序(如 Web 服务器、数据库)消耗了 CPU。sy很高,说明是内核操作(如网络、I/O 处理)消耗了 CPU。
- 查看
-
内存瓶颈:
- 查看
memory列的free值。free持续很低(低于总内存的 10%),而swap列的swpd为 0,说明系统内存紧张,但还没用到交换空间,此时应考虑增加内存或优化应用程序。 swpd、si、so都不为零且持续很高,这是非常严重的内存瓶颈信号,系统正在频繁地将内存页换入换出,会导致系统性能急剧下降(称为“颠簸”或 "Thrashing"),必须立即优化或增加内存。
- 查看
-
I/O 瓶颈:
- 查看
io列的bi和bo,如果这两个值持续很高,说明磁盘 I/O 非常繁忙。 - 查看
cpu列的wa。wa值很高,说明 CPU 在等待 I/O 完成,这进一步证实了 I/O 瓶颈,可能需要检查磁盘性能、文件系统或使用更快的磁盘(如 SSD)。
- 查看
-
进程/系统瓶颈:
procs列的r值持续大于 CPU 核心数,说明进程数过多,CPU 调度压力大。system列的cs值非常高,说明进程间切换频繁,可能是因为太多小任务在竞争 CPU 资源。
vmstat 是系统管理员和开发者进行性能故障排查的第一线工具,它提供了一个快速、高层次的系统资源概览,虽然它不如 top 或 htop 那样能提供每个进程的详细信息,但它的简洁和聚焦使其非常适合用于:
- 快速检查系统整体健康状况。
- 监控 CPU、内存、I/O 的实时趋势。
- 初步定位性能瓶颈的方向(是 CPU、内存还是 I/O 问题?)。
掌握 vmstat 是成为一名高效 Linux 用户的关键一步。
