从 THP 到 Folio:Linux 内存管理的大变革与“断舍离”

1. 透明巨页(THP):初衷与局限

什么是 THP?

透明巨页 (Transparent Huge Pages, THP) 是 Linux 内核为了简化巨页(Huge Pages)使用而引入的一项技术。在 Intel 处理器上,标准页大小为 4KB,而巨页通常为 2MB。

解决的问题

  • 降低 TLB 抖动:通过使用更大的页,减少 CPU 中转换后备缓冲区(TLB)的条目数量,提高地址转换效率。

  • 减少管理开销:减少内存管理数据结构(如页表)占用的空间。

  • 易用性:传统的 hugetlbfs 需要手动配置,而 THP 允许内核在后台自动将 4KB 页合并为 2MB 页,对应用程序透明。

合入版本与评价

  • 合入版本:THP 最早由 Red Hat 开发者 Andrea Arcangeli 提交,并在 Linux 2.6.38 版本正式合入。

  • 开发者评论:当时社区反响热烈,认为这是大型内存应用(如数据库)的福音。但也有开发者(如 Linus Torvalds)对某些边缘情况下的内存空洞和分配延迟(Direct Reclaim 导致的系统卡顿)表示过担忧,认为其“自动合并”机制有时过于激进。


2. Folio:内存管理的新基石

提出的原因

随着硬件发展,内存容量激增,内核中大量使用 struct page 来管理内存。然而,struct page 只有 64 字节,却要承载极其复杂的各种状态标志。对于复合页(Compound Pages),内核不得不通过复杂的逻辑来追踪头页(Head page)和尾页(Tail pages),代码冗长且易出错。

解决的问题

Matthew Wilcox 在 2020 年引入了 Folio 概念。

  • 抽象封装:Folio 是对“一个或多个物理连续且属于同一文件”的页面的封装。

  • 消除歧义:明确区分了“单个内存页”和“管理单元(Folio)”,避免了在处理大页时不断检查是否为复合页的开销。

  • 提升效率:通过 Folio 缓存(取代原有的 Page Cache 逻辑),内核可以一次性处理更大的数据块。

开发者建议

社区起初对这种大规模重构持谨慎态度。许多开发者建议 Folio 应该逐步演进,先从文件系统(如 XFS)开始试点,再推广到整个内存子系统。


3. Folio vs THP:为何要“取而代之”?

特性THP (Transparent Huge Pages)Folio (Multi-size THP)
灵活性尺寸固定(通常为 2MB)支持多种尺寸(mTHP,如 16K, 64K, 2MB)
透明性在底层秘密合并,上层感知弱深度集成到 Page Cache,全链路感知
开销存在严重的内部碎片浪费尺寸可调,能更好地平衡碎片与性能
代码设计属于“补丁式”增强是内核内存管理的系统性重构

取代原因:THP 的只读文件支持(READ_ONLY_THP_FOR_FS)本质上是一个“黑盒”实现,khugepaged 线程在 Page Cache 背后偷偷操作,导致维护成本极高且无法支持写入逻辑。而 Folio 让 Page Cache 原生地支持大页,架构更优雅。


4. 深度观察:内核中那个“未竟的承诺”

内核开发者的预想并不总是能如愿以偿。2019 年,当内核新增了对页面缓存(page cache)创建只读透明巨页(THP)的支持时,该功能的开发者刘松(Song Liu)在 Kconfig 文件条目中承诺,对可写巨页的支持将在“接下来的几个发布周期内”实现。

然而,六年多过去了,这个承诺依然写在那里,但它永远不会兑现了。相反,这项只读功能很快将被移除,这反映了内存子系统的核心在该功能之下已经发生了怎样的变化。

历史的局限性

最初,THP 功能仅适用于匿名内存(程序数据等),而对文件支持的内存(file-backed memory)则不予处理。刘松在 2019 年的尝试试图改变这一点,但他采用的是修改 khugepaged 后台线程的方案,页面缓存对这种在背后进行的运作几乎完全不知情。由于写入支持涉及复杂的同步问题,该功能最终被严格限制在 VM_DENYWRITE 区域(通常仅限可执行文本段)。

Folio 的降维打击

2020 年底,Matthew Wilcox 引入了 Folio。它迅速演变为内核管理各种尺寸复合页的标准方式。如今,页面缓存正在向 Folio 缓存 转型。

让页面缓存自然地管理大型 Folio,似乎比在页面缓存背后拼凑 THP 是更好的解决方案。最近,开发者 Zi Yan 提交了移除 CONFIG_READ_ONLY_THP_FOR_FS 的补丁。虽然这可能导致某些不支持 Folio 的旧文件系统(除了 XFS 和 ext4 之外)出现短暂的性能退化,但维护者们认为“长痛不如短痛”。

Matthew Wilcox 对此评论道:

“如果我们留着这个后退方案,我们就永远无法推动文件系统向前发展。是时候撕掉这块绷带了;在下一个稳定版内核发布前,他们还有八个月的时间。我已经跟他们谈了好几年了。”

结语

这场变革预示着 Linux 内核内存管理将彻底转向以 Folio 为中心。虽然“只读 THP”将成为历史,但一个更高效、更通用的多尺寸内存管理时代已经到来。即将于 5 月举行的 LSFMM+BPF 峰会,或许将为这场“阵痛式”的更替画下最终的路线图。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kernel_RDMA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值