LWN: 多代化之后的LRU!

从入门到精通:HyperMesh实体选择全攻略(含2025新界面操作) 本文系统解析了HyperMesh从基础到高级的实体选择技巧,重点介绍了2025新界面的交互逻辑与效率提升。内容涵盖选择模式、框选方法、右键菜单高级选择、图形窗口选择器与命令面板的智能联动,以及利用浏览器和过滤器进行精准定位的实战指南,帮助用户显著提升前处理建模效率。 阅读详情

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

The multi-generational LRU

By Jonathan Corbet
April 2, 2021
DeepL assisted translation
https://lwn.net/Articles/851184/

memory-management 子系统的关键任务之一就是优化系统对可用内存的利用。这意味着需要把包含了不再需要的数据的 page 换出到别的地方去,从而能让这些 page 被更好的利用在其他地方。预测哪些 page 在不久之后会被访问到,这是一项棘手的任务。内核已经开发出一些机制希望提高猜对的几率。但是,内核不仅经常出错,而且很可能还耗费了大量的 CPU 时间来做出了错误的选择。Yu Zhao 发布的 multi-generational LRU patch set 就是希望改善这种情况。

一般来说,内核无法知道哪些 page 在不久的将来会被访问到,所以它必须依靠退而求其次的指标:最近被使用过的 page 的集合。最近被访问过的 page 有可能在未来会再次被使用,但也有例外。例如,假设有一个正在按顺序读取一个文件的应用程序。文件中的每一个 page 在被读取时都会被放入 page cache,其实应用程序已经不会再需要它了。在这种情况下,最近访问过,并不意味着该 page 很快会被再次使用到。

内核使用一对 least-recently-used(LRU,最少最近使用)的 list 来跟踪那些 page。最近被访问过的 page 都被保留在 "active" list 中,刚刚被访问过的 page 被放在 list 的头部。如果 page 最近没有被访问过,就从 list 的尾部移除出来,放在 "inactive" list 的头部。inactive list 中的 page 如果被某个进程访问到了,那么就会被再次加到 active list 中。有些 page,比如上面例子中的来自顺序读取文件所产生的 page,会一开始就在 inactive list 里面,这意味着如果没有后续使用的话,这些 page 会被较快地回收掉。

当然,还有更多的细节需要处理。尤其需要注意的是,这里实际上有两对 list,一对针对匿名页(anonymous page),另一对针对文件内容(file-backed)的 page。如果正在使用 cgroup 的话,那么每个 active cgroup 都有完整的这几个 LRU list。

Zhao 的 patch set 指出了当前方案的一些问题。分为 active/inactive,对于要想得到准确的决策来说,还是太粗糙了,而且 page 经常都被放到错误的 list 上了。尤其是在 cgroup 中使用了全套的独立 list,使得内核很难对各个 cgroup 中 page 的相对新旧程度进行对比。内核由于一些原因,长期以来偏向于优先把针对文件的(file-backed)page 给换出去(evict),这可能导致一些包含有用的文件的 page 被换出而空闲无用的匿名页仍然留在内存中。这个问题在云计算环境中变得更加严重。这种场景下,每个客户的本地存储(local storage)相对较少,因此导致,文件支持(file-backed)的 page 相对来说本来就很少。同时,匿名页的扫描会比较耗时,部分原因是因为它使用了复杂的反向映射(reverse-mapping)机制,当需要进行大量的扫描时,这个机制的表现并不理想。

Closing the generation gap

multi-generational LRU patch 希望试图通过两个底层改动来解决这些问题。

  • 增加更多的 LRU list,目的是不仅只分为 active 和 inactive list,而是将两者之间的 page age 范围也涵盖起来。这些 list 就被成为“generations(代)”

  • 改变 page scanning 的方式来减少其开销。

最近使用过的 page 会被分配到最年轻的一代(尽管有一些例外情况,后面有描述)。随着时间的推移,内存管理子系统会扫描各个进程的 page,以确定每一个 page 自从上次扫描之后是否被使用过。那些一直闲置的 page 就会被移到下一代的 list 去,表示有一段时间没有用过了。任何一代中的 page 如果有发生过访问,就会被移回最年轻的一代的 list 中。

这项工作最后产出的是一个根据 page age 年龄来得到的多组分布,既有那些最近被访问过的 page,又有那些在一段时间内没有被使用的 page。支持多少代,可以通过内核配置来设置。对于手机场景来说,这个数字似乎可以小到 4 个,而对于云服务器来说,数字则应该是这个数字的几倍。

当需要回收 page 时,只需要考虑最老的这一代。对于匿名页和文件内容(file-backed)page 来说,"最老的一代" 可能是不同的。匿名页一般来说更难回收(通常它们总是需要被写入 swap 中),于是这个新功能的代码中会更加偏向于更积极地回收 file-backed page。因此,file-backed page 可能不会像匿名页面那样能经过那么多代的 list 而未被回收掉。不过,目前的 patch 中对 file-backed page 的回收只允许比匿名页回收提前一代。

据称,multi-generational 机制比目前的双链表方法更加准备。当一个页面进入最老的一代时,比起 inactive list 中的页面来说,它更加可能不再被需要了。这反过来意味着这些 page 可以被更积极地回收掉,能拿到更多的内存来用于真正使用它的任务。这种机制允许随时比较匿名页和 file-backed page 的年龄,通过跟踪每一代的创建时间,来比较不同 cgroup 中 page 的年龄。当前的内核中这个信息并没有持续记录下来。反过来,这也使得识别和回收闲置的匿名页变得更加容易。

另一个号称具有的优势是改变了 page 的扫描方式。page 是通过每个进程中的 page-table entries(PTE,页表项)来访问的,这些 PTE 中就含有这个 "最近访问过" 的标志位。不过,目前内核是通过 page 本身进行扫描的,必须使用反向映射来寻找并检查相关的 PTEs,这个操作很耗时。而 multi-generational LRU 代码则直接扫描 PTE,这种方法具有更好的本地性(locality,意味着很少有全局影响)。scheduler 中的一个 hook 则可以帮助跟踪自从上次扫描以来实际运行过的进程,因此可以跳过那些没有执行过的进程。

multi-generational LRU 还受益于跳过了当前内核中用于决定哪些页面应该被回收的许多启发式方法的做法。不过,还是有一些保留了。比如,当一个 page 被首次建立时,就会根据这些规则来决定它应该被安排在哪一个 generation。

  • 当前由于发生 fault 而引入的 page,会被分配到最年轻的一代,这是大家公认的合适做法。

  • 未被映射的 page(也就是驻留在内存中但没有 PTE 指向它,这些 page 包括被选定要回收、但被再次引用之前实际上尚未被回收的 page)如果被再次引用,就会加到第二年轻的这一个 generation。这样做似乎是为了避免使最年轻的一个 generation 包含太多 page 从而延迟后续的 page scan 到创建下一代的时候。

  • 正在被回收(reclaim)的 page,但在其内容完全被写入后备存储之前必须要一直保持可访问,这些就会被添加到第二代。这可以防止在回写(writeback)过程中再次尝试回收它们。

  • 正在被停用(deactivated)的 page 会进入最老的一代。那些由 readahead 机制带来的 page 也会被放到这里,毕竟读取这些 page 其实是内核的一种投机预测行为,并不能保证它们会有用武之地。

有一些提供给 user space 的开关可以控制这个机制,包括可以完全关闭 multi-generational 代码。更多信息请看这个documentation patch。

Generational change

据说,在完成所有这些工作之后,page reclaim 比以前更有效、更有针对性。像安卓这样的系统,在使用这种方案时,可以看到有更少的 low-memory kill(指应用程序进程由于内存不够而被杀死),Chrome OS 也测到更少的 out-of-memory kill,服务器系统也能更好地利用可用内存。这看起来是一个全面的改进。

鉴于此,人们可能会感到疑惑,为什么 multi-generational 算法要与内存管理代码的其他部分分开,并且还是 optional(可选的)。本质上,它是一种完全独立的 page aging and reclaim(内存页老化和回收)方法,跟当前的 LRU list 是并列存在的关系。据推测,分离开来的原因是有很多 workload 可能不会从这种方案中得到好处。我们需要做更多的测试,从而以了解 multi-generational LRU 在哪些方面会出现问题,以及需要做什么来防止这种情况发生。

multi-generational LRU 最终可能会赢得内存管理开发者的支持,他们中的大多数人还没有对这个 patch set 发表意见。不过,它还是需要在大部分 workload 中能表现出更好的性能(或者至少是没有性能降低),才能让大家赞同它可以作为当前 LRU 的替代品,而不是仅仅是 LRU list 的补充。维护两个独立的 LRU 方案,会给内核社区带来不少困难。如果 multi-generational LRU 真的更好,那么完全切换到过去会是更好的选择。

要想回答清楚这个问题,肯定会有一个漫长的过程。memory-management 这边哪怕较小的改动也会需要不少时间才能合入。因为这里的改动非常可能给某些用户带来性能损失。这个变化不是 "relatively small" (改动相对不大)的,所以要想得到合入,标准会更高。但是,如果 multi-generational LRU 真能达到它所说的水平的话,它最终还是应该能达到这个标准的。

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

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

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

TTL转RS422(B)工业级转换模块设计:从原理到实战部署 在工业自动化与嵌入式系统中,串行通信是实现设备间数据交换的基础。其核心原理在于通过特定的电气标准与协议,将数据位序列化后进行传输。RS422作为一种差分平衡传输协议,相比常见的TTL电平,在抗共模干扰与远距离传输能力上具有显著的技术优势,这使其成为工业现场总线、楼宇自动化等对可靠性要求严苛场景的优选方案。要实现TTL设备与RS422网络的稳定互联,关键在于设计一个能够完成单端信号到差分信号高质量转换的硬件模块。这涉及到差分总线收发器芯片的选型、包含终端电阻与TVS二极管的保护电路设计,以及遵循差分走线规则的 阅读详情

相关推荐

芯片低功耗设计实战:CPF与UPF流程选择指南(附工具对比)

本文深入探讨了芯片低功耗设计实战中CPF与UPF流程的选择策略。文章从两者本质差异与演进脉络出发,结合Cadence与Synopsys工具链的深度支持实况,为工程师提供了基于项目场景的决策框架。重点分析了在混合工具链环境下如何实施流程与验证,并强调了利用Spyglass等工具确保功耗意图无损传递的关键技巧,旨在帮助团队做出明智的流程抉择,提升设计效率与可靠性。

weixin_29197051的博客 405

LWN:多代LRU方案的未来!

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

Linux News搬运工 1242

粒子滤波在基于误差状态量的INS/GNSS组合导航中的使用技巧-On Particle Filter based Error-State INS/GNSS Intergrated Navigation

本文面向以15维惯导(INS)误差为状态量,3维位置误差为量测量的INS/GNSS组合导航系统,​在西工大严恭敏老师的开源工具箱中PF相关库函数基础上实现基于粒子滤波(PF)的惯导误差状态量的递推估计,设计了粒子重置环节并强调了其在本特定场景下的重要性。

I33D33I的博客 1742

LWN:重新审视多代 LRU

Barry Song 提出了 另一个单独的抱怨:当系统执行 预读 (readahead)(投机性地读取它认为用户空间可能很快请求的数据)时,它会将所有生成的页面放入最年轻的一代,即使并不能保证这些页面一定会被使用。内核必须处理的核心内存管理任务之一,是确定哪些页面应保留在内存中,哪些页面应被换出到较慢的存储设备中(即“回收 (reclaim)”)。这看起来将是一场有趣的会议。从(仅限订阅者的) Zhao 的 KSDB 页面 可以看到,他偶尔会改进 MGLRU,但最后一次是 6.14 内核中的几个提交。

Linux News搬运工 208

STM32玩转C++:从Arduino库到HAL库的封装思路(Clion环境配置指南)

本文介绍了如何在STM32开发中使用C++封装HAL库,从Arduino风格过渡到更高效的开发方式。通过Clion环境配置指南和详细的代码示例,展示了如何利用C++的面向对象特性简化GPIO、UART等外设操作,提升代码可读性和开发效率。特别适合嵌入式开发者和从Arduino转向STM32的开发者。

weixin_33737134的博客 335

决策规划算法四:Piecewise Jerk Path Optimizer

一,问题分析 路径规划的本质目的:规划出一条安全(无碰撞),舒适(平滑),符合车辆运动学的轨迹。 如下图所示,决策算法开辟凸空间后,路径规划算法用数值优化的方法搜索出一条最优路径,即将问题转化为二次规划的问题,采用二次规划的求解器进行求解。 二次规划问题的求解顺序: 1,确定优化变量 2,确定目标函数 3,确定约束条件 4,将目标函数和约束条件变形为二次规划的标准形式 5,用二次规划求解器进行求解,获得优化变量的序列,使得目标函数取得最小值。 注:路径的最终表达式为:,..

肥嘟嘟的左卫门 8560

LWN:如何合并 multi-generational LRU!

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

Linux News搬运工 1446

StarCCM+ 导入STL几何模型进行仿真

通过 Import Surface Mesh 的方法导入 STL 文件进行仿真

薛定谔的alpha狗 6129

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

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

Linux News搬运工 1822

mjlab 入门教程(一)MuJoCo 人形机器人强化学习训练 sim-to-real 部署框架

摘要:mjlab是一个结合IsaacLab API与MuJoCo简洁性的GPU加速机器人仿真框架,专为强化学习和机器人研究设计。它提供快速安装(支持uv、pip、conda和Docker)、核心功能(域随机化、NaN守护、观测历史/延迟、执行器/传感器系统)以及从IsaacLab的迁移指南。相比IsaacLab,mjlab更轻量、启动更快,直接构建在MuJoCo Warp上,避免了Omniverse开销。其哲学强调裸机性能、开发者体验和核心领域专注,适合需要快速迭代和直接MuJoCo控制的用户,而Isaac

2506_90492529的博客 2724

PostgreSQL性能优化:如何搭建监控体系?

本文系统讲解如何构建企业级PostgreSQL监控体系,覆盖四大核心维度:基础设施层、数据库实例层、会话与查询层、对象与存储层。通过Prometheus+Grafana+ELK等工具链实现指标采集、可视化与告警闭环管理,详细解析关键监控指标、部署方法及告警策略设计,帮助DBA快速定位慢查询、连接泄漏、存储膨胀等典型故障,构建"看得见、管得住、防得早"的数据库运维能力。

数据知道的博客 2232

[Linux]学习笔记系列 -- [mm][mmzone]

Linux内存管理中的LRU机制与lruvec结构 摘要:lruvec是Linux内核中用于管理LRU(最近最少使用)页面回收的核心数据结构,定义于mm/vmscan.c。它通过维护多个链表来跟踪不同类型内存页面的使用状态,包括活跃/非活跃的匿名页和文件页等。该技术解决了现代计算机系统中高效内存管理的核心问题:平衡页面回收的开销与准确性,支持NUMA架构扩展性,并实现容器环境下的资源隔离。随着Linux 6.1引入多代LRU(MGLRU)机制,页面回收算法进一步优化,能够更精确识别冷热页面,减少性能开销。作

wdfk-prog.space 1249

【ArcGIS微课1000例】0149:Geographic Imager6.6下载安装教程

首先保证电脑上安装对应版本的PS软件,笔者安装的是PS2023(V24.7)版本,然后安装本软件。保持以上窗口运行状态,然后打开PS,自动弹出如下窗口。勾选【Automatically checkout LIcense】,点击Close。双击setup开始安装,点击【确认】,一路默认安装到底。驱动器:DVD-ROM驱动器(用于DVD版本)处理器:2GHz或更快的英特尔或AMD处理器。安装完成后,将Crack中的所有文件拷贝到。硬盘:600 MB的可用硬盘空间用于安装。内存:4GB内存(建议8GB或更高)。

智慧空间实验室 1217

LWN: 使用DAMON调整LRU-list!

关注了就能看到更多这么棒的文章哦~LRU-list manipulation with DAMONBy Jonathan CorbetAugust 22, 2022DeepL assisted translationhttps://lwn.net/Articles/905370/DAMON 子系统在 5.15 发布周期中进入了内核,它使用了一些启发式方法来确定哪些内存 page 正在被使用。从一开...

Linux News搬运工 715

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

LWN:优化内存中经常需要访问的匿名页!

关注了就能看到更多这么棒的文章哦~Working-set protection for anonymous pagesByJonathan CorbetMarch 19, 2020原...

Linux News搬运工 737

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

LWN:各种BPF实现的性能对比!

关注了就能看到更多这么棒的文章哦~Comparing BPF performance between implementationsBy Daroc AldenJune 5, 2024LSFMM+BPFGemini-1.5-flash translationhttps://lwn.net/Articles/976317/Alan Jowett 在 2024 年的Linux 存储、文件系统、内存管...

Linux News搬运工 946

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

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

LWN:folio的最新情况!

关注了就能看到更多这么棒的文章哦~A memory-folio updateBy Jonathan CorbetMay 4, 2022LSFMMDeepL assisted translationhttps://lwn.net/Articles/893512/folio 项目还不到两年,但它已经导致了对内核的内存管理以及文件系统层的重大改变。虽然已经做了很多工作,但仍有不...

Linux News搬运工 1448

LWN:要提供更好的 OOM 调试工具!

关注了就能看到更多这么棒的文章哦~Better tools for out-of-memory debuggingBy Jonathan CorbetMay 11, 2022LSFMMDeepL assisted translationhttps://lwn.net/Articles/894546/Out-of-memory(OOM)的情况是用户、系统管理员以及内核开发人...

Linux News搬运工 400

LWN:分层内存的主动回收及其他!

关注了就能看到更多这么棒的文章哦~Proactive reclaim for tiered memory and moreBy Jonathan CorbetMay 13, 2022LSFMMDeepL assisted translationhttps://lwn.net/Articles/894849/Linux 中的内存回收(memory reclaim)基本上是采...

Linux News搬运工 592

如何合并 multi-generational LRU

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

Chinese_big_boy的博客 731

LWN:优化只有一个用户的内存!

关注了就能看到更多这么棒的文章哦~Optimizing single-owner memoryBy Jonathan CorbetMay 26, 2023LSFMM+BPFDeepL assisted translationhttps://lwn.net/Articles/932391/内核里的内存管理子系统的主要优化目标是要能最大程度地共享资源。但是,正如 Pasha Tatashin 在 20...

Linux News搬运工 1095

workingset protection/detection on the anonymous LRU list

Working-set protection for anonymous pages [LWN.net][PATCH v3 0/9] workingset protection/detection on the anonymous LRU list [LWN.net]14.7 跟踪LRU活动情况和Refault Distance算法-优快云博客

yiyeguzhou100的专栏 1448

LWN: 20年后能否解决 negative dentry 问题!

关注了就能看到更多这么棒的文章哦~Negative dentries, 20 years laterBy Jonathan CorbetApril 11, 2022DeepL assisted translationhttps://lwn.net/Articles/890025/文件系统和虚拟文件系统层的任务就是管理实际存在的文件,但 Linux 的 "dentry ca...

Linux News搬运工 908

LWN:kernel defconfig是为谁准备的?

内核的配置选项控制着内核如何构建的诸多方面。它 启用了许多内存管理选项(memory-management options),包括内存热插拔(memory hotplugging)、内核同页合并(kernel samepage merging,KSM)、透明大页(transparent huge pages)、userfaultfd 机制(userfaultfd)、内存控制组(memory control groups)以及 多代 LRU(multi-generational LRU)。

Linux News搬运工 1520

LWN:6.1 合并窗口第二部分!

关注了就能看到更多这么棒的文章哦~The rest of the 6.1 merge windowBy Jonathan CorbetOctober 17, 2022DeepL assisted translationhttps://lwn.net/Articles/910608/Linus Torvalds 于 10 月 16 日发布了 6.1-rc1,并关闭了 6.1 合并窗口;此时,有 11...

Linux News搬运工 563

LWN:参与者共同记录page flags!

关注了就能看到更多这么棒的文章哦~Documenting page flags by committeeBy Jonathan CorbetMay 22, 2024LSFMM+BPFGemini-1.5-flash translationhttps://lwn.net/Articles/974515/对于系统中的每个内存页面(page),内核都会维护一组页面标志(page flag),描述页面的使...

Linux News搬运工 546
上一篇: LWN: kernel中GCC plugin的未来命运!
下一篇: LWN: 秘钥扫描!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值