在 AL2023 内核上使用多代 LRU(MGLRU)
多代 LRU
传统的 LRU 机制使用双列表模型(活跃和非活跃)来跟踪页面使用情况,这在具有大型工作集的现代工作负载中可能效率低下。MGLRU 用多“代”页面取代了这种机制,允许内核基于更细粒度的老化信息做出更智能的决策。
MGLRU 的好处包括:
-
更好的回收决策:更准确地识别冷(未使用)页面。
-
更低的延迟和更高的吞吐量:特别是对于具有大地址空间或许多并发进程的工作负载。
-
改进的缓存保留:最近使用的页面不太可能被过早换出。
-
可扩展且锁高效的设计:在具有多个 CPU 的机器上表现更好。
配置和调优
AL2023 内核启用了内核配置 CONFIG_LRU_GEN。这会编译进 MGLRU,但默认不启用它。
可以使用 /sys/kernel/mm/lru_gen/enabled 文件启用和调整 MGLRU。该值是一个位掩码。建议启用所有组件,除非其中某些组件存在不良副作用。
| 位 | 组件 |
|---|---|
0 |
多代 LRU 的主开关。 |
1 |
当 MMU 设置时(例如在 x86 架构上),以大批量方式清除叶子页表项中的访问位。此行为理论上可能加剧锁争用 (mmap_lock)。如果禁用此功能,对于连续映射热页的工作负载,多代 LRU 将遭受轻微的性能下降,因为这些页面的访问位本可以通过较少的大批量操作清除。 |
2 |
当 MMU 设置时(例如在 x86 架构上),同时清除非叶子页表项中的访问位。此行为未在 Intel 和 AMD 以外的 x86 变体上得到验证。如果禁用此功能,多代 LRU 将遭受可忽略不计的性能下降。 |
[yYnN] |
启用/禁用上述所有组件。 |
如何启用 MGLRU 的示例:
[ec2-user ~]$echo y >/sys/kernel/mm/lru_gen/enabled
此命令启用所有组件:
[ec2-user ~]$cat /sys/kernel/mm/lru_gen/enabled0x0007