v6
2026-11-11
修复MGLRU swappiness行为 · v6
mglru v6 调整多代 LRU 的最老代回收、代际保护、匿名/文件扫描预算与淘汰统计。
原始补丁链接
子 Patch(15)
1/15
mm/mglru: report evictable sizes per type
lruvec_evictable_size() 改为分别返回匿名页和文件页可回收量,lruvec_is_sizable() 与 get_nr_to_scan() 改用分量;总和不变,为后续独立权衡两类页准备。
2/15
mm/mglru: extract lruvec_populated_min_seq() helper
把 try_to_inc_min_seq() 中按类型查找最老已填充代的操作抽成 lruvec_populated_min_seq(),并以 max_seq 为上限避免越界搜索;纯重构,无功能变化。
3/15
mm/mglru: reclaim from the oldest populated gen
修正 MGLRU 同步两类型 gen 导致 scan_folios() 反复扫描空旧代的问题;在默认优先级无法满足回收需求时改为从仍有页的最老已填充代回收,避免回收停滞。
4/15
mm/mglru: lift the forced protection of reclaimer
删除 get_nr_gens()==MIN_NR_GENS 的提前返回,让高优先级扫描可覆盖 max_seq,避免高压下因等待 aging 而提前 OOM;映射页仍由 rmap PTE 检查保护。
5/15
mm/mglru: skip zones above reclaim_idx instead of rotating them
让 scan_folios() 只在 reclaim_idx 以内区域扫描,lruvec_populated_min_seq() 增加 zone_limit,并删除 sort_folio() 的 ineligible 旋转分支;避免保护区域页反复扫描并阻碍 aging。
6/15
mm/mglru: return for unavailable anon reclaim earlier
把 anon 回收不可用时的提前返回路径整理到更靠前位置,减少无效后续判断;仅代码搬移,不改变行为,为后续预算拆分补丁做准备。
7/15
mm/mglru: balance anon and file scan budget by refault rate
用 lru_gen_balance_scan() 按 swappiness、缺页再访问率和 LRU 规模比例拆分 anon/file 扫描预算,每轮同时扫描两类,替代 get_type_to_scan() 的单类型整批选择。
8/15
mm/mglru: lift youngest gen protection for higher priority
按回收优先级逐步放宽对最年轻代的强制保护:默认优先级仍遵守 MIN_NR_GEN,压力升高后允许扫描更年轻代,避免 aging 跟不上导致 MGLRU 提前 OOM。
9/15
mm/mglru: Avoid placing rejected folios below populated gen
move_folios_to_lru() 接收 scanned_seq,确保被拒绝的页提升到比已扫描代更年轻的位置;当已填充代就是最年轻代时放入最年轻代,避免反复扫描造成 pg_steal/pg_scan 过低。
10/15
mm/mglru: Run aging when pages are rare outside the youngest gen
当两类型最年轻代之外的页少于其 1/MAX_NR_GENS 时触发 aging,极端 swappiness 下还看类型平衡;仅在低优先级且每优先级一次,提升回收效率并减少系统时间。
11/15
mm/mglru: Restrict eviction accounting to eligible zones
lruvec_evictable_size() 与 lru_gen_imbalanced() 只统计 sc->reclaim_idx 以内可回收区域,避免受保护区域页虚增扫描量,使 eligible 区域页少时 aging 更及时。
12/15
mm/mglru: Reduce LRU lock contention by shrinking folio batches in inc_min_seq
缩小 inc_min_seq 每批从最老代搬到次老代的 folio 数量,缩短持有 lruvec lock 的时间,让并发 LRU 操作更快推进并显著降低锁竞争。
13/15
mm/mglru: Avoid prolonged anon reclaim with swappiness=200
swappiness=200 时 file_factor 为 0 会让回收长期偏向 anon;在较低优先级如 sc->priority < DEF_PRIORITY/2 时给文件回收一个小因子,避免 anon 回收拖慢整体。
14/15
mm/mglru: Make swappiness=1 file reclaim more aggressive
让 swappiness=1 在高优先级下把 anon_factor 置 0,与 swappiness=200 的 file_factor=0 对称,使文件回收更激进,利好依赖文件页回收的工作负载。
15/15
mm/mglru: Avoid scan anon while swapcache is low for GFP_NOIO allocation
在 GFP_NOIO 且 swap cache 很低时,MGLRU 不再给匿名页分配扫描预算,因为没有 swap cache 的 anon 无法回收;沿用 CLRU 的跳过逻辑,减少无效扫描。