v5
2026-10-23
修复MGLRU swappiness行为 · v5
MGLRU v5 优化代际回收:按类型统计可回收页、从最老已填充代回收,并据重故障率调整扫描预算。
原始补丁链接
子 Patch(14)
1/14
mm/mglru: report evictable sizes per type
lruvec_evictable_size()改为分别返回匿名与文件可回收页数,lruvec_is_sizable()、get_nr_to_scan()相应按类型衡量,总量不变,为后续配比扫描铺垫。
2/14
mm/mglru: extract lruvec_populated_min_seq() helper
从try_to_inc_min_seq()抽出lruvec_populated_min_seq(),在max_seq上限内查某类型最老非空代,替代内嵌逻辑,纯重构无功能变化。
3/14
mm/mglru: reclaim from the oldest populated gen
默认优先级不足时,scan_folios()改从实际最老非空代回收,避免被同步的空代号卡住,缓解低swappiness下文件回收停滞。
4/14
mm/mglru: lift the forced protection of reclaimer
删除get_nr_gens()==MIN_NR_GENS提前返回,让高优先级扫描边界覆盖max_seq,使高压下回收继续推进,避免MGLRU提前OOM。
5/14
mm/mglru: skip zones above reclaim_idx instead of rotating them
lruvec_populated_min_seq()加zone_limit,scan_folios()仅降序扫描reclaim_idx内区域,并删除sort_folio()不可回收分支,避免旋转保护页浪费扫描。
6/14
mm/mglru: return for unavailable anon reclaim earlier
将匿名页不可回收时的返回路径提前,重排get_nr_to_scan()相关代码,为后续按类型预算扫描铺路,无功能变化。
7/14
mm/mglru: balance anon and file scan budget by refault rate
新增lru_gen_balance_scan()按swappiness、refault率与LRU尺寸分摊扫描预算,替代get_type_to_scan()单类型选择,每轮同时扫匿名与文件。
8/14
mm/mglru: lift youngest gen protection for higher priority
默认优先级仍保护MIN_NR_GENS内的年轻代,但优先级升高时逐步放开最年轻代保护,避免高压下回收线程只见空代而提前OOM。
9/14
mm/mglru: Avoid placing rejected folios below populated gen
move_folios_to_lru()增加scanned_seq,被拒folio提升或放入最年轻代,避免落在已扫描populated代以下反复被扫,并修复冷热反转。
10/14
mm/mglru: Run aging when pages are rare outside the youngest gen
当最年轻代之外页数低于其1/MAX_NR_GENS时触发老化;极端swappiness还看类型平衡,并限制在低优先级每优先级一次,提升回收效率。
11/14
mm/mglru: Reduce LRU lock contention by shrinking folio batches in inc_min_seq
在inc_min_seq()中缩小每批从最老代搬到次老代的folio数量,缩短lruvec锁持有时间,降低并发LRU操作的锁竞争。
12/14
mm/mglru: Avoid prolonged anon reclaim with swappiness=200
swappiness=200时file_factor为0会使回收长期偏向匿名页;在priority低于DEF_PRIORITY/2时给文件一个小因子,避免文件回收停滞拖慢负载。
13/14
mm/mglru: Make swappiness=1 file reclaim more aggressive
swappiness=1时在高优先级把anon_factor置0,使文件回收更激进,与swappiness=200偏向匿名页形成对称,改善以文件回收为主的负载。
14/14
mm/mglru: Avoid scan anon while swapcache is low for GFP_NOIO allocation
GFP_NOIO下匿名页若不在swapcache就无法回收;沿用CLRU的swapcache低阈值,在扫描预算中跳过匿名扫描,避免无效开销。