当前位置:首页>Linux>MGLRU:Linux 内存管理的革命性改进

MGLRU:Linux 内存管理的革命性改进

  • 2026-09-09 00:14:37
MGLRU:Linux 内存管理的革命性改进

MGLRU:Linux 内存管理的革命性改进

从传统 LRU 到多代链表,Google 工程师如何让 Linux 内存回收效率提升数倍。


为什么需要 MGLRU?

Linux 内核使用 LRU(Least Recently Used) 算法来决定哪些内存页该被回收。传统实现只有两个链表:活跃链表和非活跃链表。

问题在于:

  1. 冷热混杂
    :一个长时间未被访问的"冷页"可能仍然留在活跃链表
  2. 抖动问题
    :频繁访问的页面在回收后又被重新加载,造成不必要的 I/O
  3. NUMA 不友好
    :传统 LRU 是全局的,无法区分不同 NUMA 节点的访问局部性

MGLRU 的核心思想

MGLRU(Multi-Generation Least Recently Used) 是 Google 工程师 Yu Zhao 提出的多代 LRU 实现,于 2022 年合并到 Linux 5.15 内核。

多代链表结构

关键机制

1. 老化(Aging)

当一个页面被访问时,它不会立即被提升到最年轻的代,而是根据访问频率逐步老化。

2. 代际回收(Generation Reclaim)

当内存压力增大时,内核从最年老的代开始回收。


性能对比

指标
传统 LRU
MGLRU
提升
工作集识别准确率
基准
+30%
显著提升
页面错误率
基准
-15%
减少抖动
内存回收延迟
基准
-40%
更快响应

实际场景:

  • 桌面环境
    :应用切换更流畅,减少卡顿
  • 服务器
    :数据库缓存命中率提升,TPS 增加
  • 容器环境
    :内存超卖更高效,OOM killer 触发减少

如何启用 MGLRU

检查内核版本

uname -r# 需要 5.15 或更高版本

查看当前状态

cat /sys/kernel/mm/lru_gen/enabled# 输出:0x0003 表示启用(所有类型)

启用/禁用

# 启用所有类型的多代 LRUecho 0x0003 | sudo tee /sys/kernel/mm/lru_gen/enabled# 禁用echo 0 | sudo tee /sys/kernel/mm/lru_gen/enabled

常见问题

Q: MGLRU 和 zswap/zram 有什么区别?

MGLRU 是页面回收策略,决定哪些页面先被回收。zswap/zram 是压缩缓存,决定回收后的页面存在哪里。两者可以配合使用。

Q: 会增加内存开销吗?

每页增加约 8 字节(用于存储代数信息),对于 16GB 内存系统,开销约 4MB,可忽略不计。

Q: 所有场景都适用吗?

对于内存充足的系统,MGLRU 和传统 LRU 差别不大。内存压力大或NUMA 环境下收益最明显。


参考资料

  • MGLRU 主线合并 PR
  • Yu Zhao 的原始设计文档
  • Linux 5.15 发行说明
  • Phoronix 性能测试

作者简介:huan睆标签:#Linux #内核 #内存管理 #MGLRU #性能优化

最新文章

随机文章