摘要
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. 模块深度解耦
- • 压缩与换出路径(Zswap / Swap)各模块职责清晰、可独立演进,未来甚至可接入 AI 引导的自适应回收调度。
3. 为下一级规模做好准备
- • lockless 结构的普及目标直指 TB 级内存、数千核的服务器系统,让内核在高并发下保持线性扩展。
4. 成本驱动优化
内存优化的本质不是炫技,而是“用更少的硬件资源支撑更多的业务负载”——省钱、提效,让每一字节物理内存、每一丝磁盘 I/O 都花在刀刃上。