vmstat 不能直接显示内存水位线,但可通过 si/so 持续非零、free 长期低于 low、buff/cache 异常波动及 r/b/wa 升高等指标间接判断是否逼近或突破 high 水位;须结合 /proc/zoneinfo 中的 low/high 值验证。

vmstat 本身不直接显示内存水位线(如 min/low/high),也不能告诉你“当前是否达到 high 水位”,但它能帮你**间接判断系统是否已触发或逼近高水位导致的内存回收行为**——尤其是直接回收(direct reclaim)和kswapd 异步回收活跃度。
看 si/so 是否持续非零:确认是否进入紧急回收
high 水位不是回收起点,而是内核开始直接回收的临界点之一(当空闲内存跌破 high,且分配压力大时,会绕过 kswapd,立即同步回收页)。此时最典型表现是:
- si(swap in)和 so(swap out)持续大于 0,尤其 so > 0 且数值波动较大(如每秒几十 KB 到几 MB)
- 伴随 free 值长期低于 low 水位附近(需结合 /proc/zoneinfo 查 low 值换算对比)
- 系统响应变慢、延迟抖动,top 中无明显高 CPU 进程,但 r 队列升高
观察 free 和 buff/cache 的动态关系:识别回收压力趋势
high 水位附近,内核会 aggressively 回收 page cache,表现为:
- free 缓慢回升 + buff/cache 明显下降:说明 kswapd 正在异步回收(low → high 区间内工作)
- free 忽然跳升 + buff/cache 断崖式下跌:可能刚经历一轮 direct reclaim(突破 high 后强制清理)
- 若 free 长期卡在低位(如仅比 low 高一点点)、buff/cache 却不降反涨:说明应用分配快于回收,已逼近 high 或突破,kswapd 来不及跟上
结合 r、b、wa 看回收引发的连锁反应
内存高水位触发的回收不仅耗 CPU,还会加剧 I/O 和调度压力:
- r(运行队列)持续 ≥ CPU 核数 × 2:说明有进程因等待内存分配而排队
- b(不可中断进程)升高:常见于 direct reclaim 中进程阻塞在 lru_lock 或 page lock 上
- wa(I/O 等待)同步上升:尤其 so > 0 时,写 swap 导致磁盘忙;或回收脏页触发 writeback
必须搭配 /proc/zoneinfo 定位真实 low/high 值
vmstat 的 free 是全局值,无法反映各 zone 水位。要验证是否“高水位触发”,必须查实际阈值:
- 执行:cat /proc/zoneinfo | awk '/Node.*zone/{n=$0} /low.*:/&&n{print n,$0}'
- 找到类似 low 1856 的输出,换算成 MB:1856 × 4 / 1024 ≈ 7.25 MB
- 再查对应 zone 的 high 值(通常为 low + (low−min) × watermark_scale_factor/100),对比 vmstat 中的 free 是否频繁低于该值


















