当前位置:首页>Linux>Linux 7.1 内存管理大升级:从 MGLRU 到 Swap 重构,性能与成本的双重博弈

Linux 7.1 内存管理大升级:从 MGLRU 到 Swap 重构,性能与成本的双重博弈

  • 2026-10-11 08:38:51
Linux 7.1 内存管理大升级:从 MGLRU 到 Swap 重构,性能与成本的双重博弈

摘要

Linux 7.1 在内存管理子系统中带来了一次系统性的升级:不仅重构了 Swap 元数据结构,还增强了 MGLRU 回收路径、修复了内存控制组(memcg)的生命周期问题,并优化了透明大页(THP)与压缩内存路径。


一、MM 核心路径总览

从用户态的内存分配请求,到内核底层的物理页回收,整个调用链条清晰地反映了 Linux 7.1 的内存管理脉络:

用户态 malloc()         ↓  glibc brk/mmap         ↓  sys_mmap / sys_brk         ↓  do_mmap()                     ← mm/mmap.c         ↓  handle_mm_fault()             ← mm/memory.c         ↓  do_page_fault()         ↓  alloc_pages()                 ← mm/page_alloc.c         ↓  内存不足 →         ↓  try_to_free_pages()           ← mm/vmscan.c         ↓  shrink_node()         ↓  shrink_lruvec()               ← MGLRU 核心

简单理解:应用申请内存,内核查找空闲页,若内存不足则触发页面回收,MGLRU 正是这一回收过程中的“智能调度员”。


二、核心改进

1. Swap 重构(mm/swapfile.c)

旧方式:直接递增交换槽位的引用计数 swap_map[offset]++,结构单一,难以精细控制。

新方式:引入专门的查找和表项管理接口。

swap_entry = lookup_swap_cache();       // 查找交换缓存项swap_count = swap_table_lookup(entry);  // 基于表结构查询引用计数

改进点:将原本扁平化的计数升级为结构化的表查询,使得交换页的引用跟踪更加高效、可扩展,为后续的锁无关(lockless)操作打下基础。


2. MGLRU 调用栈

MGLRU(Multi-Gen LRU)是 Linux 7.1 页面回收的核心革新。它不再使用单一的活跃/非活跃链表,而是按“世代”对页面进行分组,能更准确地识别冷热数据。

try_to_free_pages() └── shrink_node()      └── shrink_lruvec()           └── evict_folios()                └── folio_referenced()                     └── rmap_walk()                          └── page_referenced_one()

通俗比喻:传统的 LRU 像把所有书按“最近翻过”排在一排,而 MGLRU 像把书分成“这个月翻过”、“上季度翻过”、“一年没碰”几个书架,回收时优先清理最老的那个书架,决策更准,抖动更少。


3. Maple Tree(mm/mmap.c)

Maple Tree 作为新的 VMA(虚拟内存区域)管理结构,替代了传统的红黑树,优化了查找和遍历性能。

structmaple_copy {// 更紧凑、更缓存友好的拷贝结构};

好处:在大规模并发场景下,Maple Tree 的 RCU 友好设计减少了锁争用,让进程的地址空间操作(如 mmap、munmap)更快更稳。


4. khugepaged(mm/khugepaged.c)

内核大页回收线程 khugepaged 的扫描与合并路径得到优化。

khugepaged_scan() └── collapse_pte_mapped_thp()

作用:透明大页(THP)可以提升 TLB 命中率,降低页表遍历开销。7.1 的优化让大页合并更及时,碎片化管理更精细。


5. memcg(mm/memcontrol.c)

修复了内存控制组(memcg)对象引用计数中的生命周期问题,防止资源泄漏。

mem_cgroup_put() → css_put()

意义:在容器和云环境中,cgroup 频繁创建与销毁时,旧版本可能出现内核对象残留。此修复确保了资源的彻底释放,避免长期运行后的内存“隐形消耗”。


6. Zswap(mm/zswap.c)

压缩交换缓存(Zswap)路径的优化,涵盖存储与压缩两个核心函数。

zswap_store()        // 页面存入压缩缓存zswap_compress()     // 压缩算法调用

收益:延迟压缩、更智能的淘汰策略等改进,直接降低了 I/O 的临界延迟,在内存紧张时让系统响应更丝滑。


三、架构关系图

Maple Tree → MGLRU → Swap → Zswap(地址管理)   (回收策略) (交换层) (压缩缓存)  更快的VMA查找  更准的冷热识别  更高效的I/O预备  更低的写入延迟

四大组件协同,构成了一条从“管理地址空间”到“回收页面”,再到“换出至磁盘/压缩缓存”的高效流水线。


四、典型应用场景

云计算

  • • memcg 修复 → 消除容器化部署下 cgroup 频繁回收的资源泄漏。
  • • MGLRU → 使大规模多租户环境下的内存回收不再粗暴,保障各容器性能隔离。

嵌入式 & 移动设备

  • • ZRAM 优化 → 在低内存安卓/IoT 设备上,压缩内存的改进直接减少卡顿,延长应用驻留能力。

桌面 & 工作站

  • • Swap 优化 → 多任务切换、浏览器重标签页等场景下,磁盘 I/O 减少,桌面响应更流畅。

五、总结与趋势分析

Linux 7.1 内存管理子系统的更新远不止“修修补补”,它体现了内核社区在四个方面的重要思维转变:

1. 从“结构优化”到“策略优化”

  • • swap_map 计数 → swap table 结构查询
  • • 经典 LRU → 多代 MGLRU内核不再只是存好数据,更开始关注数据如何被访问,回收决策由“粗暴”转向“智能”。

2. 模块深度解耦

  • • 地址空间管理(Maple Tree)
  • • 页面回收策略(MGLRU)
  • • 压缩与换出路径(Zswap / Swap)各模块职责清晰、可独立演进,未来甚至可接入 AI 引导的自适应回收调度。

3. 为下一级规模做好准备

  • • mTHP(多尺寸透明大页)支持
  • • lockless 结构的普及目标直指 TB 级内存、数千核的服务器系统,让内核在高并发下保持线性扩展。

4. 成本驱动优化

内存优化的本质不是炫技,而是“用更少的硬件资源支撑更多的业务负载”——省钱、提效,让每一字节物理内存、每一丝磁盘 I/O 都花在刀刃上。


参考链接:

https://lore.kernel.org/lkml/20260413214952.62836ac9df0eb348ee4aeb2b@linux-foundation.org/ https://lore.kernel.org/lkml/20260418223823.b45ef6a83267fa886d182ed7@linux-foundation.org/T/#u

感谢阅读!欢迎反馈与评论。

最新文章

随机文章