首页/系统/Linux 内核与性能调优速查//proc/buddyinfo 碎片观测
内存与 OOM58 条

/proc/buddyinfo 碎片观测

按内存区和阶数展示空闲块数量;高阶块(order 5 以上)长期为 0 说明碎片化严重,大页与高阶分配会很吃力。

碎片观测

/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 开销
  • 长期观测并记录突变时间点,与发布、扩容等变更对照

易错点

  • 单次读数就下结论:必须看趋势与变化时间点
  • 把高阶为零当内存不足:实际是碎片问题,总内存可能很充足
  • 只看一个 zone:不同区的碎片程度差异可能很大
  • 忽略页大小:阶数对应的字节数随页大小变化
  • 不做归因记录:碎片改善后要记录对应操作才便于复现

数据来源与参考

  • Linux 内核 Documentation/filesystems/proc.rst
  • Linux 内核 Documentation/admin-guide/mm/concepts.rst
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌