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 峰会,或许将为这场“阵痛式”的更替画下最终的路线图。


1429

被折叠的 条评论
为什么被折叠?



