碎片观测
/proc/buddyinfo 按内存区(zone)与阶数展示空闲块数量:每个 zone 一行,各列从左到右依次是 order 0(单页)到更高阶的连续空闲块数量。阶数 n 表示 2 的 n 次方个连续页,所以 order 9 是 512 个连续页。高阶列长期为零说明碎片严重,此时大页分配与需要连续内存的内核分配会非常吃力。判断要点是持续趋势与突变时间点,单次读数说明不了问题。
基本信息
| 读取 | cat /proc/buddyinfo |
|---|---|
| 列含义 | 从左到右依次是 order 0 到高阶 |
| 关注点 | 各 zone 右侧的高阶列 |
| 关联分配 | 大页、THP、网络与存储缓冲区 |
| 采样方式 | 固定间隔观察趋势 |
典型使用场景
- 大页分配失败或成功率明显偏低
- 长期运行的服务出现与新启动时不同的分配行为
- 排查高阶分配失败的内核日志
- 与其他内存指标交叉判断碎片程度
- 变更前后对比碎片改善情况
采样观察
采样观察
cat /proc/buddyinfo
watch -n5 'cat /proc/buddyinfo' # 固定间隔观察趋势
cat /proc/pagetypeinfo | head -20 # 需相应权限,查看页类型分布
cat /proc/vmstat | grep -E 'compact_(success|fail|stall)'
grep -E 'HugePages|AnonHugePages' /proc/meminfo
sysctl vm.compaction_proactiveness读法与判读
| 项 | 含义 | 判读 |
|---|---|---|
| zone 行 | 每个内存区一行 | 不同 zone 的碎片程度可能差别很大 |
| order 0 列 | 单页空闲块数量 | 通常都很充足 |
| 高阶列 | 连续大块的数量 | 长期为零说明碎片化严重 |
| 突变时间点 | 某次读数突然变化 | 与近期操作或负载变化相关联 |
单次读数无法说明问题,判断要看持续趋势与突变时间点,最好配合固定间隔采样。
高阶块不足的常见来源是内核模块与驱动的连续分配需求,并不只是应用侧行为。
改善碎片的手段
- 启动早期预留大页,避免运行期依赖连续内存分配
- 降低长期高阶分配需求,排查驱动与模块的连续分配行为
- 适度提高碎片整理的主动程度,同时接受额外的 CPU 开销
- 长期观测并记录突变时间点,与发布、扩容等变更对照