defrag_mode
page_alloc 碎片整理模式
sysctl 0 / 1
保持 pageblocks 干净
目标
正确 migratetype
防互相污染
减少碎片
长期保持干净
手段
强制 ALLOC_NOFRAGMENT
优先 reclaim / compaction
最后才允许 fallback
前提:分配能回收
前提
分配能 direct reclaim / compaction
不可回收分配是例外
旧策略 · 不碎片化
慢路径仍带 NOFRAGMENT
get_page_from_freelist
优先本类型
快速路径
本地 migratetype
不跨类型
保持干净
减少污染
回退
只最后允许
跨 migratetype
避免污染
依赖 reclaim / compaction
defrag_mode=1
NOFRAGMENT 贯穿慢路径
直到特殊退出点
不可回收分配
GFP_ATOMIC 为例
不能睡眠
不能 direct reclaim
慢路径
!can_direct_reclaim
提前退出
goto nopage
不再尝试平衡
标志残留
ALLOC_NOFRAGMENT 仍在
不尝试 fallback
其它类型有空闲也失败
哪怕内存充足
触发条件
defrag_mode=1 + NOFRAGMENT
不是内存耗尽
为什么不能回退
reclaim / compaction 不能跑
策略无法兑现
却仍按策略失败
GFP_ATOMIC
中断或持锁上下文
不能睡眠
不能等回收
只能请求 kswapd
结果
本类型 freelist 空
其它类型有空闲
NOFRAGMENT 禁止回退
直接失败
矛盾
策略假设能回收
失败不是没内存
修复 · 清标志 retry
在 !can_direct_reclaim 处
检查三个条件
清 NOFRAGMENT 后重试
三个条件
defrag_mode
ALLOC_NOFRAGMENT
__GFP_KSWAPD_RECLAIM
同时成立才清
retry
ALLOC_KSWAPD 保留
先唤醒 kswapd
再查 freelist
允许跨类型回退
不是绕过水位
仍按慢路径规则
只放开 NOFRAGMENT
判据 · 谁被救
不可直接回收
但请求 kswapd
才清 NOFRAGMENT
会被救
GFP_ATOMIC
带 __GFP_KSWAPD_RECLAIM
本想等 kswapd
不能自己回收
不会被救
GFP_TRANSHUGE_LIGHT
不请求 kswapd
纯投机分配
仍允许失败
看 flag
不是看分配名字
判据是 __GFP_KSWAPD_RECLAIM
生产观察
defrag_mode=1
Meta 受载服务
2 小时窗口
失败
85,509 次
skbuff_head_cache
GFP_ATOMIC
SLUB 分配失败
空闲
~13 GB
其它 migratetype
freelist 有空闲
仍然分配失败
网络路径
丢包 / RPC 失败
尾延迟 / 服务降级
修复后
恢复跨类型回退
只在这条慢路径
不改 defrag_mode
机制收益
不再被 NOFRAGMENT 直接挡下
可回退到其它类型
仍受水位约束
不是无限制分配
不承诺
无新 benchmark
无修复后延迟数字
只恢复回退能力
不写成普遍提升
范围
只救“本想回收”
纯投机仍失败
空格
播放/暂停
←
→
逐动作
R
重播
⚠
1x