主动碎片整理
内存碎片整理把分散的空闲页合并成连续大块,供高阶分配(大页、连续缓冲等)使用。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 并可能造成停顿,线上执行要评估业务窗口并准备回退方案。
替代与配套手段
- 预留大页:在系统启动早期预留,从根本上满足连续内存需求
- 控制高阶分配需求:排查应用与驱动是否存在不必要的连续分配
- 调整内存水位与回收策略:降低内存紧张时的分配失败概率
整理能否成功与当前内存压力直接相关:压力越高越容易触发整理,但人工放大参数并不保证一定整理出足够大的连续块。