首页/系统/Linux 内核与性能调优速查/vm.compaction_proactiveness 主动碎片整理
内存与 OOM58 条

vm.compaction_proactiveness 主动碎片整理

内核主动做内存碎片整理的积极度(0-100,5.18 起默认 20);也可向 /proc/sys/vm/compact_memory 写值手动触发一次全局整理。

主动碎片整理

内存碎片整理把分散的空闲页合并成连续大块,供高阶分配(大页、连续缓冲等)使用。vm.compaction_proactiveness 控制内核主动整理的积极程度,取值范围 0 到 100,内核 5.18 起默认值为 20。也可以向 /proc/sys/vm/compact_memory 写入值手动触发一次全局整理。整理过程需要搬移页面,会消耗 CPU 并可能引入停顿,适合放在低峰执行。

基本信息

参数名vm.compaction_proactiveness
默认值20(5.18 起)
手动触发echo 1 > /proc/sys/vm/compact_memory
观察计数/proc/vmstat 的 compact_success、compact_fail、compact_stall
代价消耗 CPU,可能引入停顿

典型使用场景

  • 高阶分配失败频繁告警,怀疑碎片化
  • 大页分配成功率低
  • 长期运行的服务分配行为与新启动时明显不同
  • 低峰期手动整理以缓解临时碎片
  • 评估是否该改用预留大页替代依赖整理

查看与触发

查看与触发
sysctl vm.compaction_proactiveness
grep -E 'compact_(success|fail|stall|migrate)' /proc/vmstat
cat /proc/buddyinfo                    # 各阶空闲块数量
cat /proc/pagetypeinfo | head -20      # 需相应权限,观察页类型分布
echo 1 | sudo tee /proc/sys/vm/compact_memory   # 手动触发一次全局整理
sysctl -w vm.compaction_proactiveness=10        # 降低主动整理强度

整理相关指标

指标含义判读
compact_success整理成功次数长期为零说明整理难以奏效
compact_fail整理失败次数高位增长说明碎片程度严重
compact_stall因整理而被拖住的次数与延迟毛刺直接相关
buddyinfo 高阶列连续空闲块数量长期为零即碎片化严重
整理只是缓解手段:碎片问题根治要靠预留大页或避免长期高阶分配,不能把定期整理当成长期方案。
手动触发全局整理会消耗 CPU 并可能造成停顿,线上执行要评估业务窗口并准备回退方案。

替代与配套手段

  • 预留大页:在系统启动早期预留,从根本上满足连续内存需求
  • 控制高阶分配需求:排查应用与驱动是否存在不必要的连续分配
  • 调整内存水位与回收策略:降低内存紧张时的分配失败概率
整理能否成功与当前内存压力直接相关:压力越高越容易触发整理,但人工放大参数并不保证一定整理出足够大的连续块。

易错点

  • 线上随意手动整理:会产生 CPU 峰值与停顿,应在低峰并同时观察业务指标
  • 把 proactiveness 调到 100:持续整理的开销可能超过它带来的收益
  • 只盯整理不看需求来源:高阶分配需求本身不合理时,整理治标不治本
  • 忽略 compact_stall 与延迟的关联:毛刺常被误判为应用 GC 或锁竞争
  • 单次读数下结论:buddyinfo 与 vmstat 计数都要看趋势与增量

数据来源与参考

  • Linux 内核 Documentation/admin-guide/sysctl/vm.rst
  • Linux 内核 Documentation/admin-guide/mm/compaction.rst
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌