vm.defrag_mode=1
non-movable 分配只取 non-movable pageblock
movable 大块留给 THP 等大页
目标:保护连续 movable 区域
movable pageblock
non-movable pageblock
non-movable 请求
需要一整块 non-movable pageblock
代价:碎片化时池子先耗尽 → 请求进入 slowpath
碎片化严重 → non-movable pageblock 耗尽
non-movable 池子见底
请求进入 allocator slowpath
direct reclaim
释放的主要是 movable 页
用不上
non-movable 请求
回收 → 还是用不上 → 再回收
循环空转:reclaim storm 的起点
极少能整块释放出 non-movable 请求可用的 pageblock
recurring pressure spikes
swap storms
部分工作负载反复进入内存压力
userspace OOM 规则
pressure + swap utilization
两个信号共同驱动 OOM kill
tracing 定位
non-movable 请求在 kswapd/kcompactd
过载时空转,做无产出的 direct reclaim
不是分配慢,是回收做了无用功
请求要 non-movable block,回收给 movable 页
slowpath 不再只等:参与 pageblock production
以 pageblock_order 主动发起 direct reclaim 与 direct compaction
non-movable
进入 slowpath
pageblock_order
direct reclaim + direct compaction
生产 non-movable block
这次请求能用上
被动回收 movable 页 → 请求用不上
主动生产 non-movable block → 请求有产出
回收与压缩都按整块 pageblock 做,不再碰运气
配套一 · compaction 能生产
compaction 为 non-movable 请求
生产 pageblock
不再只服务 movable 请求
配套二 · capture control
由 allocator 拥有并武装
compaction 只负责把它指向
正在 compact 的 zone
核心改动落地:slowpath 参与 pageblock production
让 non-movable 请求主动生产自己需要的 pageblock
先铺好这两块,核心改动才能落地
① 不再空转
non-movable 请求不再在无产出的
direct reclaim 中打转
② storm 消除
reclaim storm 与 swap storm 消失
不再触发 userspace OOM 规则
③ compaction 替代无产出 reclaim
主动生产需要的 non-movable pageblock
不再被动释放 movable 页
④ 生产验证
Meta 受影响负载已运行数周
OOM kill rate 回到 !defrag_mode baseline
作者未提供量化 benchmark · 以上为基于机制与 Meta 生产报告的预期收益
defrag_mode 隔离
池子耗尽
slowpath 生产
storm 消除
OOM kill rate 回到 !defrag_mode baseline
Meta 受影响工作负载已运行数周
不靠更猛的回收,而是让回收为请求生产对的东西
non-movable 请求自己生产自己需要的 pageblock
空格
播放/暂停
←
→
逐动作
R
重播
⚠
1x