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

从 THP 到 Folio:Linux 内存管理的大变革与“断舍离” Linux内核内存管理技术正经历重大变革。透明巨页(THP)作为早期优化方案,通过自动合并4KB页为2MB页来提升TLB效率,但因碎片化和延迟问题备受争议。2020年提出的Folio概念实现了系统性重构,支持多尺寸内存管理(16K-2MB),并通过原生集成PageCache解决了THP的黑盒操作问题。随着内核逐步移除THP的只读文件支持,Folio正成为新一代内存管理标准,推动Linux从补丁式优化转向更优雅的架构设计。这场变革虽带来短期兼容性挑战,但为内存管理开启了更高效的新时代。 阅读详情

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

The kernel radar: folios, multi-generational LRU, and Rust

By Jonathan Corbet
January 20, 2022
DeepL assisted translation
https://lwn.net/Articles/881675/

内核社区非常繁忙,所以根本无法把所有正在发生的事情都写出完整的文章来介绍。还有其他一些主题可能会引起人们的兴趣,但不需要花很多篇幅来介绍。于是就有了这些短篇主题的集合文章,用来涵盖值得关注的方向的进展。这次我们选择了 folio,multi-generational LRU,以及 Rust in the kernel。

A folio update

自从不到一年前首次报道 folio 以来,它一直是一个活跃话题。回顾一下,folio 只是封装了 struct page 的一个容器,确保这个 page 不会是一个 tail page。因此,它可以用来以 single page 或更大的 page 为单位来指代内存区域。比起直接使用 page 结构来说,拥有更好的类型安全性(type-safe),运行时检查也更加少。经过广泛的讨论之后,第一组 folio patch 被合并到了 5.16 内核中。

对内存管理子系统的这么巨大的改动,自然会导致人们担心出现 regression (质量回退),但 5.16 中合入的这部分似乎没有引发什么问题。因此,5.17 版本中也就有了另一轮与 folio 有关的改动,主要集中在 page cache(用来把文件数据缓存下来)部分。在当前内核中,page cache 中放置的当然是 page 了,但是大多数系统中使用的 4KB page size 通常都太小了,管理效率比较低。在处理那些不是最小 size 的文件时,如果能每次缓存的单位能更加大,那就更有价值了。5.17 中把 page cache 也切换到使用 folio 了,它的目的之一就是允许使用 "large folios"(之所以选择这个名字是因为更清晰的名字 "multi-page folios" 有点太长了)。large folio 可能是 huge page,但并不受 CPU 所支持的那些 huge-page size 的限制。作者的计划是要支持任何 folio size,只要是 2 的幂次就行。

5.17 里的改动对于 page cache、底层文件系统的支持代码,以及 XFS 文件系统中都增加了 large folio 的支持机制,但实际上并没有开始真正使用。正如 Matthew Wilcox 在他的 pull request 中所说:"可能还有一些我忽略了的地方仍然会对 page size 有想当然的假设"。因此,会在未来的开发周期中集中寻找这类代码,从而能在 5.18 中实现正式过渡。同时,胆大的人也可以在 5.17 中就启用 large folio 来帮助找到那些遗漏的会导致出错的地方。

The multi-generational LRU

在过去的一年中,有另一个重要的内存管理改动,就是 multi-generational LRU。这个功能对内核在内存紧张时决定抛弃(evict)哪些页面的方式进行了重新的设计。当前内核在使用一个双队列系统,分别用来管理 "active" 和 "inactive" 的 page。所有 page 会根据访问情况在两个队列之间迁移。当需要内存时,会从 inactive 队列的末端来开始回收 page。multi-generational 的改动会把这个机制改为使用更多的队列,这个改动可以让内核更好地识别出哪些 page 是在不久的将来不太可能需要了的。

当 Yu Zhao 在 1 月初发布这组 patch set 的第六版时,他要求大家帮忙 review,并判断是否可以把它合并到 5.17 中。然后引发了对这个功能当前状况的长时间讨论。作为讨论的一部分,Michal Hocko(他也对补丁做了很多详细的 review)重复了一个在以前的回复中中听到过的观点:最好把这项工作看作是一系列渐进的改动,而不要当作是添加一个全新的回收机制:

reclaim 路径上的改动都是不断碰到一些错误情况以及 revert,总是在现有的 fine tuning (微调)基础上继续微调,从而完成的。那些改动跟你的 patch set 的一个主要不同点是,那些改动往往要小得多,一点点递增,因此更容易 review。

Jesse Barnes 回应说,在这个场景中如果使用增量改动方式可能会更糟糕:

我理解人们都希望能看到 "采用一点点增加的方式来让我们完成 A->B"。作为抽象的概念来说,这是个很好的方式。然而对于我们这里看到的改动来说,我认为采用递增修改的方式的话会极有可能出现大大小小的 regression,而且可能比 MGLRU 的相对简洁的设计更难以用推理来调试。此外,我认为我们如果不合入这组 patch 的话,就不会能得到我们所渴望得到的用户反馈。

Linus Torvalds 回复 Barnes 说,这项工作 "值得继续下去"。Hocko 并不反对 Barnes 的观点,但他指出,无论如何,在代码被合并之前还有很多东西需要 fix。

同时,Zhao 一直在积极尝试让这项工作的支持者们在 mailing list 中发声来支持将其合入。回应者包括 Holger Hoffstätte、Shuang Zhai("性能的提高是难以置信的")、Suleiman Souhlal("ChromeOS 上的 Android 已经使用 MGLRU 有一段时间了,效果很好")、Sofia Trinh、Donald Carr 和 Oleksandr Natalenko。

显然,人们希望合并这个功能。不过,这显然不在 5.17 的计划之内。通常情况下,人们会认为这种根本性的改变会需要很长时间才能实现。但考虑到压力,以及 Torvalds 已经批准,那么这次改动可能比较快。乐观来看 5.18 版本中很可能会包含,总之应该是在 2022 年的某个时刻了。

Rust for Linux

Rust for Linux 项目希望用 Rust 编程语言来开发内核 module,这个工作仍在继续向前推进。1月 17 日的时候发布了 Rust 支持功能第三版 patch set。为了能跟上 Rust 社区的步伐并且使这个功能满足合入要求,其中做了一些修改。

这版 patch set 支持最新的 1.58 版本编译器(也是必须要求要用这个版本)。构建系统现在能够自动确定 Rust 工具链版本是否适合用来 build。发现缺少什么,它就会告诉开发者需要怎么处理。邮件中指出,内核中的 Rust 所依赖的几个之前尚未达到稳定状态的 Rust 功能,在不久的将来会发布的新版编译器中会变成稳定功能。然而,令人沮丧的是,仍然有一个很长的 required unstable feature 清单。

这组 patch set 本身会先增加 "kallsyms" 机制中可管理的符号的最大长度。看起来 Rust 使用的 name 处理机制会让符号名字变得很长,导致 255 个字符对于一些 name 来说都不够了。开发人员通常不用看这些被处理过的名字,但它们会出现在 kallsyms 中,因此这一点还是会让用户感到惊讶的。此外另一个初步步骤是为一长串在内核中看起来像函数的东西添加 C helper function,例如 readb() 或 kmap() 等,这些实际上是 macro 宏或者是 inline 函数。这些功能无法直接从 Rust 中调用,所以需要先把它们转化为正确的函数。

Rust 代码本身目前大多数是位于两个 crate 中。第一个叫做 alloc,用来处理内存分配。Rust 语言在构建时并没有考虑到当内存分配失败时代码可能会需要继续执行下去的需求,因为它以为正常来说应该要马上 crash 才对。由于在内核代码中 crash 被认为是不礼貌的(impolite),所以需要使用能处理这种错误的 allocator 的修改版本。按照 Rust 开发者的期望,它会返回一个 Result 对象,其中包含一个指向所分配内存的指针或一个错误提示,完全取决于分配成功了与否。看起来这些支持会失败的内存分配的功能会要进入 upstream 的 Rust library,所以最终来说内核里面的这个 crate 应该会被移除。

另一个 crate 叫做 kernel。它包含了其余的匹配代码,用来把内核 API 变得看起来像相应的 Rust 接口。包含了 char 设备、clock framework、file structure、file_operations 成员、memory-mapped I/O 函数、mutex、spinlock 等接口。令人惊讶的是,实现通用的 linked list 就用了大量的代码。

总的来说,这一切都是为了实现用 Rust 编写内核代码所做的大量工作。代码相当多,今后需要更广泛地使用,从而来看这些实现是否是沿着正确的方向的。当然,这会有助于把 Rust 支持合入 mainline kernel,让更多的开发者可以看到并使用它。Torvalds 在 2021 年的维护者峰会上表示,他希望把这个功能合入进来,但是暂时还没有迹象表明会在什么时候发生。时间点很可能取决于 Torvalds,在他认为是为这种新语言打开大门的好时机的时候。

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

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

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

35f8672d033b4e455dbf6f0cbdd99702.png

multi-generation lru系列 - 怎么决定回收anon还是file Linux 回收内存到底怎么计算anon/file回收比例,只是swappiness这么简单?-优快云博客。 阅读详情

相关推荐

Linux内核内存管理中的folio机制更新及其对文件系统的影响

内容概要:本文详细介绍了 Linux 内核中内存管理子系统的 folio 项目进展及其对文件系统层的影响。自 2020 年启动以来,folio 作为一种物理上连续页面的表示方式,旨在解决内核中‘页’定义模糊的问题,并通过管理更大的内存块来提高性能和效率。文中讨论了 folio 在读取路径、写入路径、文件系统转换等方面的具体应用与挑战,特别是大 folio 分配策略和与现有接口兼容性问题。Matthew Wilcox 在 2022 年的存储、文件系统及内存管理峰会上强调了 folio 转换的重要性和紧迫性,并指出未来的改进方向。 适合人群:Linux 内核开发者、操作系统研究人员和技术爱好者。 使用场景及目标:①了解内核最新进展并将其应用于实际开发工作中;②探索如何利用 folio 提升文件系统性能;③评估将现有文件系统迁移至新架构的可能性与复杂度。 其他说明:文中还提到一些具体的技术细节如 LRU 列表长度大幅减少(高达千倍)、写放大问题以及去除部分过时的操作(例如 write_begin/write_end),这对于深入研究该领域提供了宝贵的参考。

LWN:folio的最新情况!

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

Linux News搬运工 1448

内存管理演进:Linux 内核对匿名内存的大尺寸 Folios 支持及其性能优化

内容概要:本文探讨了 Linux 内核引入大型 Folios(大页)来管理匿名内存的技术进展。Folios 具备动态调整页面大小的能力,从而减少页面错误次数和提升内存访问效率。文中介绍了一项改进内存映射机制的工作,在处理匿名内存时默认分配更大的folios,例如 64 KB,默认情况下无法分配大的folio则退回到较小尺寸。同时讨论了硬件支持,例如 ARM 架构下的连续物理地址映射以及与传统 Huge Pages 类似的 TLB 缓存机制,以此缓解虚拟内存转换过程带来的性能开销,显著改善应用尤其是内核编译性能表现,并降低 TLB 错失率。作者还提到了当前工作面临的挑战与尚未解决的问题,如与现有特性集成的复杂性和多架构支持的需求。 适合人群:对 Linux 内核内存管理有兴趣的研究者和技术开发者。 使用场景及目标:针对操作系统开发者和研究人员,了解现代操作系统内核中先进的内存管理和优化策略的应用方式,旨在为后续相关研究和技术开发提供理论依据和支持。 其他说明:尽管该工作已经展示了一些初步成果并取得了一定程度的认可度,但最终是否能够被正式纳入主线版本仍需要克服一些技术和兼容性的障碍。这将对未来生产环境下的高性能计算平台产生积极影响。

2024年Linux内核社区关于large folio和mthp的关键进展

所以唯一可行方案是THP recovery,也就是在被split的1GBTHP基础上,保留未被重新分配的页,并将已被重新分配的页的数据复制到额外的4KB页,然后将原有的1GB物理区域“物归原主”成THP。由于 mTHP 的 size 大于 4KiB 的 small folios,理论上,它更容易出现 false sharing 的情况,频繁迁移会导致内存跨 NUMA Node 来回 ping-pong,因此,在算法上,mTHP 暂时借用了 PMD-mapped 的 2-stage filter 机制。

GetnextWindow的专栏 2981

逆变器母线电容选型与均压电阻设计实战指南

本文为逆变器母线电容选型与均压电阻设计提供了实战指南。文章从工程角度出发,详细解析了母线电容耐压值、容值的计算方法,并重点强调了纹波电流热设计的重要性。同时,深入探讨了串联电容均压电阻的设计原则与功率计算,通过5.5kW变频器案例,系统演示了从参数确定到最终选型的完整流程,旨在帮助工程师设计出稳定可靠的逆变器系统。

weixin_29299807的博客 291

Minio HTTPS证书配置实战:从申请到部署全流程

本文详细介绍了Minio HTTPS证书配置的全流程,从申请到部署,确保对象存储服务的安全性。内容包括证书类型选择、文件处理、服务配置调整及常见问题解决,帮助用户在生产环境中快速实现HTTPS加密传输,提升数据安全。

weixin_42638178的博客 431

由Google、OPPO、ARM、华为等大厂程序员贡献的Linux Large Folios大页在社区和产品的现状和未来...

本文对 Linux 内核目前热点项目 Large Folios 的社区与产品现状进行剖析,并预测未来趋势。文中讲述的技术内容,来自 Google、OPPO、ARM、Nivida、Samsung、华为、alibaba 等多家公司的社区与产品贡献。作者 | Barry Song,Yu Zhao 责编 | 梦依丹出品 | 优快云(ID:优快云news)在 Linux 内核中,一个 folio...

优快云资讯 5149

哈密顿-雅可比不等式:连接最优控制与优化算法的自然物理原理

在控制理论与优化算法之间,存在一个深刻而实用的桥梁。最优控制理论旨在通过设计控制输入,使动态系统在时间维度上达到性能最优,其核心数学工具如庞特里亚金极大值原理和哈密顿-雅可比-贝尔曼方程,为解决连续时间系统的优化问题提供了优雅框架。然而,这些方法在高维非凸问题中面临求解难题。哈密顿-雅可比不等式作为一种松弛方法,通过构造李雅普诺夫函数并验证一个不等式条件,转而寻求性能有保障且易于实现的次优解,其本质是保证系统能量衰减和性能上界。这一原理与耗散性理论紧密相连,体现了自然物理系统(如阻尼振动)中能量耗散的普遍规

weixin_30582943的博客 313

直播预告 | Linux内核page到folio的变迁

Once upon a time,Netscape的大拿 Phil Karlton曾经说过:“There are only two hard things in Computer Science: cache invalidation and naming things”,成为程序界流传甚广的名言,可见取名是计算机科学中最难的两件事之一。取名,要用名字恰到好处地描述其想描述的事物,要体现代码注释的...

内核工匠 547

用LTspice仿真Buck电路输出电容:从参数计算到波形优化的全流程演示

本文详细介绍了使用LTspice仿真Buck电路输出电容的全流程,从理论计算到波形优化。通过解析关键参数如纹波电压、瞬态响应和ESR,结合工程计算方法和LTspice仿真技巧,帮助工程师优化Buck电路设计,解决输出纹波过大和瞬态响应不佳的问题。

night的博客 851

新能源知识库(98)SOC曲线介绍

​:一条异常的健康SOC曲线,往往能提前反映出电池性能的衰退或系统存在的隐患。BMS和EMS通过实时跟踪SOC值,能在电池电量过高(如>95%)时停止充电,电量过低(如<20%)时停止放电,从而避免因过度充放电引发的。​:OCV-SOC曲线上较为平坦的部分(例如,磷酸铁锂电池通常在20%-80% SOC范围)。​:在光伏、储能、电网协同的系统中,SOC曲线是能量调度的核心依据。​:电池的寿命很大程度上取决于它的工作方式。​:利用电池静置后电压与SOC的对应关系来估算,较准确但需要电池静置,无法实时使用。

竹君子之家 922

论好名字的重要性: Linux内核page到folio的变迁

一、引子Once upon a time,Netscape的大拿 Phil Karlton曾经说过:“There are only two hard things in Computer Science: cache invalidation and naming things”,成为程序界流传甚广的名言,可见取名是计算机科学中最难的两件事之一。取名,要用名字恰到好处地描述其想描述的事物,要体现代...

内核工匠 3401

快速入门:使用 SQL Server Management Studio (SSMS) 连接和查询 SQL Server 实例

开始使用 SQL Server Management Studio (SSMS) 连接到 SQL Server 实例并运行一些 Transact-SQL (T-SQL) 命令。本文介绍如何连接和查询实例SQL Server。有关 Azure SQL,请参阅连接。若要使用,请参阅连接和查询。若要详细了解如何SQL Server Management Studio,请参阅其他。......

m0_72938729的博客 5728

Linux 内存管理之page folios

Linux内核5.16版本引入page folio新机制,旨在解决传统内存管理中长期存在的"复合页"概念混乱问题。传统复合页由头页和尾页组成,导致内核函数接收page指针时无法明确区分应操作单个页还是整个复合页,造成接口语义模糊。page folio通过保证非尾页特性,使函数能明确操作整个内存单元,既提升了代码清晰度,又通过减少compound_head()调用优化了性能。

小立仔 2185

在 SAP 里,想让“同一笔业务”在多个账套(平行分类账)中生成不同编号的会计凭证,标准做法就是

摘要:SAP系统中实现同一业务在不同分类账生成独立凭证号的方法是为每个分类账配置独立的凭证类型-编号范围映射。通过FBN1/OBA7等事务码为各分类账分配专属编号段,系统过账时会按分类账自动取号,确保凭证号互不冲突。该方案适用于S/4HANA和ECC系统,支持标准过账(F-02)或分类账专属过账(FB01L)两种模式,最终实现"一业务多账套,各自独立编号"的目标。

金牌架构师 549

SAP S4 HANA:按单生产(MTO)场景中的COGS分割

本文介绍了SAP S/4HANA中提供的各种选项,以在销售订单/商品是按订单生产(以下称为MTO)生产流程中的成本对象时,在基于帐户的COPA环境中报告COGS分割信息。

adam915的博客 1191

Linux 5.15内存管理革命:Folio技术解析

Memory folios 是 Linux 内核 5.15 引入的革命性内存管理改进,旨在解决传统页面(page)机制在现代工作负载下的性能瓶颈。

814

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

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

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

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

qq_37517281的博客 3814

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

LWN:让kernel使用更大的block size!

关注了就能看到更多这么棒的文章哦~Moving the kernel to large block sizesBy Jake EdgeSeptember 27, 2023OSSEUChatGPT translationhttps://lwn.net/Articles/945646/使用更大的块大小(block size)进行I/O内核是存储和块层领域经常讨论的话题。这个话题在2023年5月的Lin...

Linux News搬运工 957

深度剖析,移动设备场景下OPPO基于用户体验优化Linux内核

以“自由、协作、创新”为理念,以推动和普及开源技术为使命,第18届“中国Linux内核开发者大会”(以下简称CLK)在10月28日于深圳正式开幕。受CLK组委会委托,本届大会由OPPO承办。大会设置主论坛,以及内存管理、云和服务器、Arch&虚拟化&I/O、调试/eBPF/调度四个分论坛,会上,OPPO围绕内存优化和内核调度等课题进行了主题演讲。

优快云资讯 1万+

图解Linux内核(基于6.x):解读Linux内存反向映射之匿名映射

内存映射中,我们经常讨论的是由虚拟内存定位物理内存(也就是folio或者page),实际上在很多场景中(比如内存回收),会涉及反向的操作,也就是反向映射。所谓反向映射,就是给定一个folio(page),将映射它的PTE(页表项)找出来。接下来我们来详细分析一下它的原理吧(本文仅分析匿名映射部分)。全书共五篇,以从易到难的顺序详细剖析了Linux内核开发的核心技术。“知识储备篇”介绍了Linux的数据结构、中断处理、内核同步和时间计算等内容,这些是理解后续章节的前提;

屿小夏.的知识博客 4万+

Linux 内存管理新特性 - Memory folios 解读

folio 是什么?它的直接价值有哪些?

阿里云云栖号 1565

LWN:如何合并 multi-generational LRU!

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

Linux News搬运工 1446

Linux 内存管理新特性 - Memory folios 解读 | 龙蜥技术

folios 是什么?

weixin_60347558的博客 878

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

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

小李独爱秋的博客 1910

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

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

Python爱好者的专栏 5739
上一篇: LWN:5.17 合并窗口的剩余部分!
下一篇: LWN:在内核里支持PGP密钥和签名!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值