LWN:重新审视多代 LRU

multi-generation lru系列 - workingset的适配 Linux 内存workingset Refault Distance算法源码及源码解析-优快云博wen一文中我们分析了workingset算法的实现原理,内核引入mglru之后workingset算法也要做相应的适配,因为mglru算法使用了PID控制反馈算法,这其中就要统计refaulted次数和eviction次数,这些数据的统计就在workingset.c中实现的,接下来我们以v6.1源码分析workingset对于mglru的适配更新。 阅读详情

关注了就能看到更多这么棒的文章哦~

Jonathan Corbet
Gemini translation
原文链接:https://lwn.net/Articles/1060967/ 

多代 LRU (Multi-Generational LRU,简称 MGLRU) 是一种替代性的 内存管理 (memory-management) 算法,于 2022 年底合并入 6.1 内核 (kernel)。它曾承诺带来大幅的性能提升和更简洁的代码。然而,自那时起,MGLRU 的进展便陷入停滞,且在许多系统中仍未启用。随着 2026 年 Linux 存储、文件系统、内存管理与 BPF 峰会 (LSFMM+BPF) 的临近,多位内存管理开发者表示希望讨论 MGLRU 的未来。虽然一些开发者正在寻找改进该子系统的方法,但另一位开发者则呼吁将其彻底移除。 

MGLRU 温故知新

内核必须处理的核心内存管理任务之一,是确定哪些页面应保留在内存中,哪些页面应被换出到较慢的存储设备中(即“回收 (reclaim)”)。通常,最佳策略是保留近期最可能被使用的页面,同时回收那些不再被使用的页面。鉴于预测未来充满挑战,内核必须高度依赖有关页面近期使用情况的信息,作为后续操作的指南。 最近最少使用 (Least-recently-used,简称 LRU) 列表便是该解决方案的关键组成部分。 

内核中经典(且目前仍是默认)的解决方案依赖于两类 LRU 列表(更准确地说,是多对类似的列表),分别被称为“活跃 (active)”和“非活跃 (inactive)”列表。被认为当前正在使用的页面应保留在活跃列表中,而那些看似未被使用的页面则进入非活跃列表。当需要回收页面以供他用时,系统会查阅非活跃列表以寻找潜在的牺牲品。该方案的大部分复杂性(以及许多启发式算法)都集中在如何正确设置这两个列表的大小,并决定何时将页面从一个列表移动到另一个列表。 

MGLRU 将这种方法扩展到了多个列表,称之为“代 (generations)”。在列表的一端,最年轻的一代包含已知(或至少被认为)在不久前被使用过的页面。每一代较老的列表则追踪那些比前几代空闲时间更长的页面。各种类型的访问会将页面从较老的代移动到较年轻的代;当需要更多空闲内存时,内核会从最老的一代开始搜刮。据称,MGLRU 能更准确地识别真正的冷页面,并在执行该工作时消耗更少的 CPU 时间。关于 MGLRU 设计的更多信息,请参阅 这篇 2021 年的文章。 

MGLRU 的困扰

近期的讨论表明,MGLRU 并未完全兑现其所有承诺。这一切始于 2 月中旬,当时 Zicheng Wang 发起了 一项关于 LSFMM+BPF 讨论 MGLRU 的请求,特别是关于它在 Android 上的表现。Wang 表示,尽管 MGLRU 已进入内核多年,但许多 Android 系统供应商并未启用它。有多个问题影响了这一决定。 

其中一个抱怨(后来也得到了其他人的响应)是 MGLRU 无法正确平衡 匿名页 (anonymous pages) 和 文件后端页 (file-backed pages) 之间的回收。传统的 LRU 为每种页面类型维护单独的一对列表(因此有了前文关于“多对”LRU 列表的评论——此外还有其他复杂情况)。这两组列表的回收通常略微偏向文件后端页,因为它们通常不需要写回持久存储;长期存在的 swappiness sysctl 调节开关 可用于调整内核攻击每个列表的激进程度。 

Wang 指出,在启用 MGLRU 的情况下,匿名页往往停留在最年轻的两代中,导致它们永远不会被回收(进而导致文件后端页被过度激进地回收)。调整 swappiness 开关并不能解决这个问题。Wang 的雇主(一家名为“荣耀”的 Android OEM 厂商)通过显式使用内存控制组来强制回收非前台应用的匿名页,但在 主线 (mainline) 内核中尚无通用解决方案。同样 提议开设 MGLRU 专题会议 的 Kairui Song 也提到了匿名页回收的问题。 

Wang 还有许多其他问题待讨论。MGLRU 可能会在任何给定的控制组中回收过于激进,释放超出所需数量的内存。在低端设备上,尤其是在可回收页面不多的情况下,它的开销太大了。此外,Android 对热应用和冷应用的定义(旨在优先处理用户当前正在交互的应用)与 MGLRU 之间存在脱节,而 MGLRU(与内核其他部分一样)缺乏这种区分。其中一些问题已通过供应商特定的补丁 (hacks) 得到解决;例如,存在 一个供应商钩子 可以豁免当前前台任务免受回收。Wang 希望讨论这些供应商修改中的哪些(如果有的话)应该进入主线内核。 

Barry Song 提出了 另一个单独的抱怨:当系统执行 预读 (readahead)(投机性地读取它认为用户空间可能很快请求的数据)时,它会将所有生成的页面放入最年轻的一代,即使并不能保证这些页面一定会被使用。这可能导致实际正在使用的页面被回收,而预读页面却留在内存中。相比之下,传统的 LRU 会将这些页面放入非活跃列表,如果没有再次被引用,它们会相对较快地被回收。至少这个问题应该可以通过一个相对简单的方案来解决。 

Kairui Song 提出的问题清单侧重点有所不同,首先是 MGLRU 使用了三个 页面标志 (page flags)。这些标志 长期处于短缺状态;试图分配哪怕一个标志的补丁往往都会遭遇强烈抵制。增加 MGLRU 管理的代数的想法也意味着需要使用更多的页面标志。他提议将这些标志移至别处,使系统支持多达 63 代,同时释放 MGLRU 当前使用的三个页面标志。 

另一个问题是某些工作负载的性能倒退(尽管其他工作负载表现更好)。Kairui Song 认为这些问题源于 MGLRU 中管理回收的控制循环,可以通过更好地追踪文件后端页的使用历史来解决。然而,这样做需要三个页面标志,大概就是那些通过将代数移至别处刚刚释放出来的标志。 

他表示,MGLRU 提供的指标在许多方面与传统 LRU 不同,这使得系统其他部分更难理解任何给定页面的内存管理状态。他提议改变页面状态的追踪方式以改善这种状况。Kalesh Singh 也 描述了指标方面的问题,称这两种 LRU 实现之间的差异巨大,这给 Android 用户空间 内存不足 (Out-of-memory,简称 OOM) 守护程序等组件带来了困难。 

顺便提一下,Kairui Song 还提到了增加一个 BPF 钩子的想法,以便自定义页面代放置的决策。 

虽然还提到了其他问题,但或许令人惊讶的是,大多数参与者都忽略了另一个相关议题:内核中原本就存在两种竞争的 LRU 实现。Kairui Song 确实注意到,他描述的问题是“MGLRU 仍不是内核中唯一 LRU 实现的诸多原因”之一。David Rientjes 补充说,讨论应涵盖“需要解决哪些问题,才能让 MGLRU 走上成为默认实现的道路,从而消除两种独立的实现”。这将是一项艰巨的任务;某些工作负载在一种实现下的表现肯定总会优于另一种,因此移除其中一种必然会导致某些工作负载性能下降。将这些倒退降低到可接受的水平尚需时日。 

索性移除它?

内核开发者(事实上也是许多项目中的开发者)长期存在一种担忧:某个开发者增加了一堆复杂的代码,然后就不再负责维护了。Matthew Wilcox 断言 这种情况正发生在 MGLRU 身上: 

在我看来,MGLRU 最大的问题是 Google 把它丢给我们后就跑了。 提交 44958000bada 声称它现在已有人维护,并增加了三名维护者。在该提交之后的六个月里,这三个人在 mm/ 目录下没有任何提交!这种状况简直令人汗颜。 

我说,把它拔掉吧。 

MGLRU 的原始开发者 Yu Zhao,正如上述提交中所注,目前已“转向其他项目”。从(仅限订阅者的) Zhao 的 KSDB 页面 可以看到,他偶尔会改进 MGLRU,但最后一次是 6.14 内核中的几个提交。虽然据说有其他开发者在处理这些代码,但自那以后,被添加到 MAINTAINERS 文件中的人都没有对 MGLRU 进行过任何更改。 

因此,在某种程度上,MGLRU 被贡献给内核后不久便遭遗弃是事实。作为 MGLRU 指定维护者之一的 Axel Rasmussen 似乎同意 这一评估,但他表示情况很快就会改变: 

我承认这是一个大问题。我们在这方面辜负了社区,我们计划从 4 月份开始纠正这一局面,例如通过与 Kairui 及其他人合作来解决悬而未决的问题。 

缺乏开发者持续的关注,无疑让 MGLRU 难以克服许多潜在用户遇到的问题。即便如此,移除它的想法几乎没有得到支持。Barry Song 请求保留它,以便解决这些问题: 

它只需要更多的工作。MGLRU 在设计上有许多亮点,包括使用更多的“代”来区分冷热页面、通过利用缓存局部性来减少扫描开销的环顾机制,以及最小化锁持有的数据结构设计。 

Gregory Price 列举了 MGLRU 的一系列已知问题。不过,他也并未要求将其彻底移出内核。 

因此,5 月份 LSFMM+BPF 上的 MGLRU 讨论似乎不太可能把时间花在彻底移除它的想法上。但人们将非常有兴趣了解需要做哪些工作才能将 MGLRU 提升到所需的性能水平,并或许在某一天成为内核中唯一的 LRU 实现。如果一些开发者愿意承诺承担这些工作,MGLRU 最终可能会取得过去几年一直缺失的进展。这看起来将是一场有趣的会议。 

LWN 评论概述:

评论区反映了用户对 MGLRU 的复杂态度。一方面,有用户表示在内存极度超售的服务器上,启用 MGLRU 后系统响应更具预测性,显著改善了 SSH 登录和服务的稳定性;另一方面,讨论也集中在技术细节上,如与 ZFS ARC 的对比,以及经典 LRU 如何通过影子列表 (shadow tracking) 为交换后端页面提供工作集保护。同时,也有观点认为 MGLRU 在未解决特定工作负载下的回收平衡和调优问题前,尚不具备全面替代传统双列表机制的条件。 

  全文完
 LWN 文章遵循 CC BY-SA 4.0 许可协议。 

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

现代 Linux 内存管理的演进与变革:从传统 LRU 到多代架构 MGLRU Linux内核内存管理正经历从传统LRU到多代架构LRU(MGLRU)的重大变革。传统LRU采用双链表结构(活跃/非活跃),在现代TB级内存场景下暴露出粒度粗、反向映射开销大等缺陷。MGLRU引入多世代概念(默认4代),通过页表扫描和布隆过滤器显著提升回收效率,但导致内核代码冗余复杂。在2026年LSFMM+BPF峰会上,社区重点讨论了三大议题:统一回收代码路径、优化MGLRU性能(如写回节流和页面缓存保护)、解决Android移动端的高响应需求(需8.3ms内完成回收)。尽管存在整合挑战,MGLRU代表内 阅读详情

相关推荐

Linux 内存管理巨变:MGLRU 是重回巅峰,还是走向被移除的终局?

摘要:Linux 6.1内核引入的多代LRU(MGLRU)曾被视为内存管理重大革新,但四年后陷入维护困境。该技术虽通过分代机制优化了内存回收效率,却面临四大挑战:匿名页与文件页回收失衡、预读机制冲突、页面标志资源紧张以及监控指标不一致。核心争议在于Google贡献代码后缺乏持续维护,导致内核社区考虑移除该功能。2026年LSFMM+BPF峰会前夕,开发者们正努力通过BPF钩子、状态重构等方案挽救MGLRU,其命运将取决于能否解决工程化落地问题。(149字)

mounter625的专栏 583

linux 内存回收mglru算法代码注释2

旧的lru算法有active与inactive两代lru,可参考新的算法在引入4代lru的同时,还引入了tier的概念。

qq_37517281的博客 3814

OpenCloudOS 9新特性全解析:从MGLRU到Cgroup V2的实战配置教程

本文深度解析OpenCloudOS 9的核心新特性,提供从MGLRU内存管理到Cgroup V2资源控制的实战配置教程。通过手把手指导,帮助系统管理员和开发者解锁服务器性能与稳定性的关键优化,实现硬件潜力的深度挖掘与高效可靠的基础设施构建。

醉三国 465

LWN:如何合并 multi-generational LRU!

关注了就能看到更多这么棒的文章哦~Merging the multi-generational LRUBy Jonathan CorbetMay 12, 2022LSFMMDeepL assisted translationhttps://lwn.net/Articles/894859/很多类型的内核改动都可以在邮件列表中讨论决定下来。然而,有些类型的 patch 就很难...

Linux News搬运工 1446

49、Linux内核内存管理:MGLRU、DAMON与OOM杀手解析

本文深入解析了Linux内核内存管理的三大核心组件:MGLRU、DAMON与OOM杀手。MGLRU帮助内核追踪页面使用情况,为页面回收提供决策依据;DAMON通过监控用户空间进程的内存访问模式,助力性能优化;OOM杀手则在内存不足时保障系统稳定运行。同时,文章详细介绍了VM过度提交策略及其对内存分配的影响,并提供了相关使用示例与流程图解,帮助开发者更好地理解和应用Linux内存管理机制。

4k5l6j7h8的博客 84

智能车小白也能懂:手把手教你用LM358和工字电感搭建电磁循迹模块(附PCB设计避坑)

本文详细介绍了如何利用LM358运放和工字电感搭建智能车电磁循迹模块,从电感选型、电路设计到PCB布局和焊接调试,提供全流程实战指南。特别针对新手常见问题,如信号干扰、电路饱和等,给出具体解决方案和参数配置,帮助智能车比赛爱好者快速掌握电磁循迹技术。

weixin_30307921的博客 401

从LRU到MGLRU:Linux内核页框回收算法(PFRA)机制、源码流程与未来演进

页框回收算法(PFRA)是Linux内核管理物理内存的核心机制,通过主动回收低价值页框避免内存耗尽。PFRA基于LRU策略,将页框分类为可回收/不可回收类型,并通过kswapd线程周期性扫描或直接回收触发。其核心流程包括扫描LRU链表、利用反向映射解除页表关联,并根据页类型执行回收操作。随着硬件发展,Linux PFRA从传统LRU演进至多代LRU(MGLRU),通过分代管理提升扫描效率和工作集识别精度,显著降低CPU开销和缺页率。2025年的前沿趋势还包括增强多核扩展性及自适应负载优化,推动PFR

小李独爱秋的博客 1910

RTDETR多模态融合实战:基于注意力机制的红外与可见光目标检测优化

本文深入探讨了基于RTDETR模型的红外与可见光多模态目标检测优化方案。针对复杂光照下的检测难题,文章提出并实战演示了如何利用注意力机制(如SimAM与交叉注意力)实现RGB与IR特征的智能动态融合,从而构建更鲁棒的“全天候”检测系统,有效提升安防、自动驾驶等场景在夜间及恶劣天气下的检测精度与可靠性。

weixin_29083373的博客 188

Linux内核新特性年终大盘点-安卓杀后台现象减少的背后功臣MGLRU算法简介

MGLRU是一种新型内存管理算法,它的出现是为了弥补传统LRU(Least Recently Used)和LFU(Least Frequently Used)算法在缓存替换选择上的不足,LRU和LFU的共同缺点就是在做内存页面替换时,只考虑内存页面在最近一段时间内被访问的次数和最后一次的访问时间,但是一个页面的最近访问次数少或者最近一次的访问时间较早,可能仅仅是因为这个内存页面新近才被创建,属于刚刚完成初始化的年代代页面,它的频繁访问往往会出现在初始化之后的一段时间里,那么这时候就把这种年轻代的页面迁移出去

Python爱好者的专栏 5739

深入解析BlueZ5与D-Bus:Linux蓝牙开发实战指南

本文深入解析BlueZ5与D-Bus在Linux蓝牙开发中的核心应用,提供从环境搭建到实战开发的完整指南。通过详细代码示例和调试技巧,帮助开发者掌握蓝牙协议栈与D-Bus接口的交互方法,实现高效蓝牙设备管理与GATT服务开发。

weixin_28292761的博客 449

在Ubuntu上安装Node.js编程

在Ubuntu操作系统上安装Node.js是非常简单的,本文将为您提供详细的安装步骤。这是一个简单的Node.js HTTP服务器示例,它将在本地主机的端口3000上监听请求,并返回"Hello, World!npm是Node.js的包管理器,您可以使用它来安装和管理Node.js模块。您已成功在Ubuntu上安装了Node.js,并创建并运行了一个简单的Node.js应用程序。现在,您已经成功安装了Node.js和npm,让我们创建一个简单的Node.js应用程序并运行它。如有任何疑问,请随时提问。

CodeNexus的博客 3524

如何合并 multi-generational LRU

Merging the multi-generational LRU很多类型的内核改动都可以在邮件列表中讨论决定下来。然而,有些类型的 patch 就很难通过这种方式完成实现。它们非常大,而且具有侵入性,需要相关开发者的实际聚在一起讨论。multi-generational LRU 工作(MGLRU)就属于这种类型,这就是为什么它是 2022 年 Linux 存储、文件系统、内存管理和 BPF 峰会(LSFMM)上一整个小时会议的主题。...

Chinese_big_boy的博客 731

9.16华为OD机试真题 新系统 - 矩阵螺旋遍历 (Java/Py/C/C++/Js/Go)

9.16华为OD机试真题 新系统 - 矩阵螺旋遍历 (Java/Py/C/C++/Js/Go)

算法大师! 640

linux内核异步内存回收的另一个思路:基于冷热文件的冷热区域精准的回收冷文件页page(可做成内核ko)

针对pagecache的一种新的内存回收思路,精确找到冷文件页,有效避免频繁refault,可做成内核ko

dongzhiyan_hjp 5088

14 ABSOLUTE评估肿瘤纯度

14 ABSOLUTE评估肿瘤纯度 Absolute介绍 ABSOLUTE可以直接从体细胞突变和拷贝数变异的结果中推断肿瘤纯度和倍性的计算方法。 通常来说,我们取肿瘤组织进行测序,往往是一个混合样品,既包括肿瘤细胞也包括正常细胞,因此需要进行肿瘤纯度 purity 的评估。当从混合样品中提取 DNA 进行测序后,得到的也是一个混合样品的结果。肿瘤不一定是单纯的二倍体了,其本身异质性高,存在部分突变部分不突变的情况,直接分析拷贝数变异,得到的结果并不准确,评估肿瘤倍性 ploidy 也更加必要。而 ABSO

qq_23435961的博客 4213

RH850从0搭建Autosar开发环境【3X】- Davinci Configurator之BswM模块配置详解(上)

RH850从0搭建Autosar开发环境【3X】- Davinci Configurator之BswM模块配置详解(上)

weixin_42412049的博客 736

LWN:内核热点: folio,多代LRU,以及Rust!

关注了就能看到更多这么棒的文章哦~The kernel radar: folios, multi-generational LRU, and RustBy Jonathan CorbetJ...

Linux News搬运工 1822

SAP_SD模块路径及运输功能后台配置简介

后台路径:SPRO—后勤执行—装运—基本发运功能—定义路线—定义传输模式根据实际运输过程运输地理的类型:海运、公路运输、空运后台路径:SPRO—后勤执行—装运—基本发运功能—定义路线—定义发运类型根据实际运输过程运输方式:汽车、卡车、火车、轮船、飞机后台路径:SPRO—后勤执行—装运—基本发运功能—路径—定义路线—定义运输连接点指在运输过程中需要中转的地区可以维护中转地区的停留的时间后台路径:SPRO—后勤执行—装运—基本发运功能—路径—定义路线—定义路径和阶段。

我小时候很黑的博客 1395

【实践】基于云峦KeyarchOS的MGLRU技术实践

本文在浪潮信息(简称KOS)环境下,对基于MGLRU技术进行内存回收时的冷页识别的精度优化效果进行了应用实践验证。

SGY_GF的博客 1167

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

LWN: 多代化之后的LRU!

关注了就能看到更多这么棒的文章哦~The multi-generational LRUBy Jonathan CorbetApril 2, 2021DeepL assisted trans...

Linux News搬运工 1266

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

LWN:多代LRU方案的未来!

关注了就能看到更多这么棒的文章哦~Multi-generational LRU: the next generationBy Jonathan CorbetMay 24, 2021Deep...

Linux News搬运工 1242

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

荣耀在MGLRU内存回收上的发力或恰到好处

MGLRU在社区已经存在一段时间了,作为比传统active/inactive LRU更加先进的回收算法,在Android领域的应用也逐步兴起,但是直接用还是有很多问题需要解决。关于MGLRU的更多细节,可以阅读笔者之前的《我们更加不需要堆砌patch的数量,只有一步一个脚印做,让每个脚印都闪闪发光、天日可见、人神共赏,才是立足之道,也是真正的踏实,哪怕只走了10步,也比胡乱堆砌的1000步强。可行的 workaround:强制把老的文件 folio 升代,但可能导致文件页在稍年轻代聚集问题;

宋宝华 517

linux 内存回收lru算法代码注释1

node_reclaim->__node_reclaim->shrink_node,这里调用shrink_node_memcgs回收后,要判断下是否分配内存速度比回收速度快太多,这种情况可能会尝试停一段时间等回收完成(reclaim_throttle),然后再看是否需要继续回收(should_continue_reclaim)。shrink_inactive_list会将部分页回收、送入swap区,或迁移到其它numa node上。

qq_37517281的博客 1644

LRU缓存及其代码实现

一、什么是LRU缓存算法 LRU,Least Recently Used算法,即一种缓存淘汰策略。 计算机的缓存容量有限,若缓存满了则需要删除一些内容,给新的缓存腾出空间,但问题是要删除哪些内容呢?当然是把用的少的缓存删掉,把最有用的数据继续保留以便于继续使用。那么如何判定哪些数据是有用的呢? 缓存淘汰的策略有很多,而LRU则是一种较为简单常用的算法,LRU判定最近使用过的数据为有用的,很久都没用过的数据是无用的,在内存满了就优先删除很久未使用,也就是无用的数据。 二、如何实现LRU缓存算法 LRU 缓存机

The_Dan的博客 916
上一篇: LWN: Magit 和 Majutsu:易于探索的版本控制
下一篇: LWN:加州《数字年龄保证法案》与 Linux 发行版
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值