vmstat(Virtual Memory Statistics)是 Linux/Unix 上最经典的系统性能监控工具,它能一次性报告服务器的 CPU、内存、IO、进程等关键指标。

可以用来排查我们之前提到的 “CPU 上下文切换过高” 和 “CPU 是否打满” 这两个瓶颈。

1 基本用法:

# 每 2 秒输出一次,共输出 5 次
vmstat 2 5

# 常用:每秒一次,持续观察(按 Ctrl+C 停止)
vmstat 1

2 输出&详解

执行 vmstat 1 后,你会看到类似这样的输出:

text

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 512400  78900 1023400    0    0    10    20  200  500 15  3 80  2  0
 5  1      0 501200  79000 1025000    0    0     0   100  350 1200 25  8 65  2  0
 8  0      0 498000  79000 1026000    0    0     0    50  400 2000 40 12 45  3  0
 procs(进程)
含义 你的关注点
r 运行队列:正在运行或等待 CPU 的进程数。 ⚠️ 重点关注:如果 r 长期 > CPU 核数(如 16 核机器上 r > 20),说明 CPU 不够用。
b 阻塞队列:等待 IO(磁盘/网络)的进程数。 如果 b 持续 > 0 且很大,说明磁盘或网络是瓶颈。
🧠 memory(内存)
含义 你的关注点
swpd 已使用的虚拟内存大小(KB)。 如果数值大且持续增长,说明物理内存不足。
free 空闲物理内存(KB)。 接近 0 时需警惕。
buff 用于块设备(如磁盘)的缓冲区大小。 正常值。
cache 用于文件系统的页缓存大小。 Linux 会自动用空闲内存做缓存,数值大是好事。
💾 swap(交换分区)
含义 你的关注点
si 每秒从磁盘交换到内存的数据量(KB)。 ⚠️ 重点关注:如果 si 和 so 长期 > 0,说明内存严重不足,性能会骤降。
so 每秒从内存交换到磁盘的数据量(KB)。 同上。
📀 io(磁盘读写)
含义 你的关注点
bi 每秒从块设备(磁盘)读入的数据量(块/秒,通常 1 块=1KB)。 高 bi 表示大量读磁盘。
bo 每秒写入块设备的数据量(块/秒)。 高 bo 表示大量写磁盘(如 RocketMQ 刷盘、数据库写入)。
⚙️ system(系统)
含义 你的关注点
in 每秒中断次数(interrupts),包括时钟、网卡、磁盘等。 如果异常高(如 > 50000),可能有硬件中断风暴。
cs 每秒上下文切换次数(context switches) ⚠️ 核心关注点:对你之前的场景(90 个消费者线程)至关重要。如果 cs 远高于 in(如 in=500, cs=20000),说明线程切换过于频繁,通常是因为线程数过多锁竞争激烈
💻 cpu(CPU 使用率)

这些列加起来是 100%。

含义 你的关注点
us 用户态 CPU 占比 你的业务代码(消费逻辑)在这里。如果持续 > 80%,说明业务代码是瓶颈。
sy 内核态 CPU 占比 系统调用、锁操作、上下文切换在这里。如果 sy > 20-30%,通常伴随高 cs,说明内核开销过大(线程太多)。
id 空闲 CPU。 如果接近 0,说明 CPU 已打满。
wa 等待 IO 的 CPU 占比 ⚠️ 重点关注:如果 wa 持续 > 10-20%,说明磁盘太慢(如下游数据库写盘慢)。
st 被虚拟机偷走的 CPU(仅虚拟机环境)。 如果 > 5-10%,说明云主机超卖严重,找云服务商。

总结:一图看懂 vmstat

text

如果 us 高 → 业务代码要优化
如果 sy 高 + cs 高 → 线程太多了(或锁竞争)
如果 wa 高 → 磁盘太慢
如果 si/so > 0 → 内存不够
如果 r 很大,id=0 → CPU 不够用了

vmstat 1看生产服务器性能

看deepseek给出的解释

正常Java应用:cs < 5,000
高并发应用:cs 5,000-15,000
你的应用:cs 24,000-27,000  ← 异常区间

nproc查看cpu核数,如果线程数远远大于核数,就存在上下文切换频繁的问题

2. 查看哪个进程导致的

bash

# 查看上下文切换最高的进程
pidstat -w 1 3

输出中看 cswch/s(自愿切换)和 nvswch/s(非自愿切换):

  • 非自愿切换高 → CPU 核数不够,线程被强制抢占

  • 自愿切换高 → 线程在等锁、IO、或主动让出CPU

# 查看该进程的线程数(确认是否真的有15个消费者线程)
ps -eLf | grep <PID> | wc -l   生产am有366个
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐