MGLRU:Linux 内存管理的革命性改进
从传统 LRU 到多代链表,Google 工程师如何让 Linux 内存回收效率提升数倍。
为什么需要 MGLRU?
Linux 内核使用 LRU(Least Recently Used) 算法来决定哪些内存页该被回收。传统实现只有两个链表:活跃链表和非活跃链表。
问题在于:
- 冷热混杂:一个长时间未被访问的"冷页"可能仍然留在活跃链表
- 抖动问题:频繁访问的页面在回收后又被重新加载,造成不必要的 I/O
- NUMA 不友好:传统 LRU 是全局的,无法区分不同 NUMA 节点的访问局部性
MGLRU 的核心思想
MGLRU(Multi-Generation Least Recently Used) 是 Google 工程师 Yu Zhao 提出的多代 LRU 实现,于 2022 年合并到 Linux 5.15 内核。
多代链表结构
关键机制
1. 老化(Aging)
当一个页面被访问时,它不会立即被提升到最年轻的代,而是根据访问频率逐步老化。
2. 代际回收(Generation Reclaim)
当内存压力增大时,内核从最年老的代开始回收。
性能对比
实际场景:
如何启用 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 环境下收益最明显。
参考资料
作者简介:huan睆标签:#Linux #内核 #内存管理 #MGLRU #性能优化