参数是什么
vm.watermark_boost_factor 控制「水位瞬时抬升」的幅度:当内核发现内存碎片化导致高阶分配困难时,会在一段时间内把各 zone 的低水位按比例抬高,提前唤醒 kswapd 做后台回收,把突发压力从分配路径上移走,而不是等分配真正失败才做直接回收。它是瞬态缓冲机制,作用在回收时机上,不会给系统多留可用内存。
基本信息
| 参数名 | vm.watermark_boost_factor |
|---|---|
| 默认值 | 15000(以 10000 为 100%,即抬高约 150% 的低水位) |
| 触发条件 | 内核自行判断的高速缓存/阶数分配困难,非人工触发 |
| 关联参数 | vm.watermark_scale_factor 决定常驻水位比例(默认 10) |
| 观测点 | /proc/zoneinfo 的 boost 与 min/low/high 行 |
| 关闭方式 | 设为 0,此时不做瞬态抬升 |
典型使用场景
- 高阶分配(大页、驱动 DMA、较大 slab 对象)间歇性失败,同时观察到直接回收计数上升
- 希望把回收压力提前交给 kswapd 后台处理,降低分配路径上的延迟尖峰
- 确认水位为何被临时抬高:在 /proc/zoneinfo 中看到非零 boost 值
- 与 THP 或大页场景联合调优,评估水位策略对高阶分配成功率的影响
- 实验性关掉该机制(设为 0),对比特定负载下延迟与分配失败率的变化
查看与调整
查看与调整
sysctl vm.watermark_boost_factor vm.watermark_scale_factor # 看瞬态抬升与常驻水位比例
cat /proc/zoneinfo | grep -E 'boost|low|min' | head # 当前水位与是否正在抬升
cat /proc/buddyinfo # 各阶空闲块分布,判断是否真的碎片化
grep -E 'compact_|allocstall|pgscan_direct' /proc/vmstat # 直接回收与整理的计数
sysctl -w vm.watermark_boost_factor=0 # 关闭瞬态抬升(实验用,重启即回退)
printf 'vm.watermark_boost_factor = 15000\n' > /etc/sysctl.d/90-vmwm.conf # 需要持久化时写入水位线读法
| 水位 | 作用 | 异常表现 |
|---|---|---|
| min | 最低线,低于它分配会同步做直接回收 | 频繁下探说明内存或水位长期紧张 |
| low | 低线,降至此处唤醒 kswapd 后台回收 | 经常贴着 low 运行说明余量不足 |
| high | 高线,回到此处 kswapd 停止回收 | 长期到不了 high 表示回收跟不上 |
| boost | 碎片化时临时叠加在 low 上的抬升量 | 平时读数为 0 属正常 |
boost 是瞬时值:只有在水位被实际抬高的那段时间,/proc/zoneinfo 里才会出现非零 boost。平时读到 0 并不代表参数没生效,需要结合 buddyinfo 与分配失败记录判断机制是否曾经触发。
它与 watermark_scale_factor 是两回事:后者按比例调整常驻的 min/low/high 水位(默认 10 即 0.1%),前者只在碎片化时做短期补偿。想「给系统多留内存」应调后者或 min_free_kbytes,而不是把 boost 当容量参数。