vmstat 不能直接显示内存碎片分布,仅提供宏观指标;需结合 /proc/buddyinfo 查看各 zone 高阶页数判断碎片程度,并辅以 slab 和水位分析交叉验证。

vmstat 本身不能直接显示内存碎片分布状态,它提供的是内存总量、空闲量、交换活动等宏观指标,属于间接观察工具。要真正检查内存碎片的分布状态,必须结合其他内核接口,尤其是 /proc/buddyinfo。
以下分三步说明如何有效判断和验证内存碎片情况:
1. 先用 vmstat 观察异常迹象
运行持续采样命令,关注是否出现“空闲内存充足但分配失败”的矛盾现象:
vmstat 1 10
重点关注这几列:
- free:空闲内存(KB),若长期 > 500MB 但应用仍报 OOM,值得怀疑碎片
- si / so:非零值频繁出现,说明内核在反复换页,可能因大块内存无法分配而退而求其次使用 swap
- r 和 b:若 r 持续高于 CPU 核数 + b 显著上升,常伴随内存紧张引发的调度延迟
举例:
free列稳定在 2GB,但si每秒跳动几十 KB,且dmesg | tail出现page allocation failure,这是典型碎片化预警。
2. 查看 buddy 系统真实碎片分布
执行:
cat /proc/buddyinfo
输出类似:
Node 0, zone DMA 1 2 3 0 0 0 0 0 0 0 0 Node 0, zone DMA32 45 67 32 18 9 4 2 1 0 0 0 Node 0, zone Normal 120 85 41 19 7 3 1 0 0 0 0
每行代表一个内存管理区(zone),每列对应连续页框数量(从 1 页 → 1024 页,即 4KB → 4MB)。
关键判断逻辑:
- 右侧高阶列(如 512、1024 页)数值越小,说明大块连续内存越稀缺
- 若
Normal区 1024 页列为0,而 256 页列也仅1,表明 4MB 连续内存几乎耗尽 - 多个 zone 同时在高阶列归零,说明碎片已影响核心内存区域
3. 辅助验证:配合 slab 和内存水位分析
- 查 slab 缓存是否过度占用小对象,挤压大页分配空间:
vmstat -m | head -20
关注
kmalloc-*或page-*类缓存的num和objsize,若大量小对象长期驻留,会加剧碎片 - 查当前内存水位线是否被频繁触达(触发直接回收):
grep -i "watermark" /proc/zoneinfo
若
low和min水位附近pages_scanned增长快,说明内核正疲于整理碎片
不复杂但容易忽略:vmstat 是“症状显示器”,buddyinfo 才是“病理切片”。单看 vmstat 会误判,必须交叉比对才能确认碎片真实程度。











