Meta工程师Kiryl Shutsemau于10月19日发布了一份重新修订的Linux内核补丁集。该版本基于Linus Torvalds此前利用AI辅助生成的代码,旨在实现Linux在不获取folio引用的情况下从页面缓存中读取数据。这份包含18个补丁的“请求评论”(RFC)版本,结合了Torvalds的7个原始补丁与Shutsemau新增的11个补丁,在针对单个文件进行小规模、多线程读取时展现出显著的性能提升。
从AI辅助分支到内核邮件列表
Shutsemau指出,多个CPU对同一文件进行微小读取时,会频繁获取并释放同一个folio的引用,导致引用计数在不同CPU间剧烈波动。新版补丁的核心机制是:只有经过RCU宽限期后,被读者复制数据的folio才会被释放。这允许处于rcu_read_lock()状态下的读取者在禁用页面错误(page faults)的情况下,直接将数据复制到用户缓冲区。
这项工作起源于Torvalds内核树中一个名为noref-filemap-read-with-llm的分支。Torvalds曾在其笔记本电脑上测试发现,当八个线程对一个页面执行16字节的pread()调用时,绝大部分硬件互斥事务冲突(HITM)都发生在持有folio引用计数的行上。这一争用问题此前曾由Matthew Wilcox在2024年从客户工作负载中指出。Torvalds的初步测试显示,使用八个线程时,每次读取的内核周期数从约2950降至725左右,每秒读取次数从约1000万次提升至3000万次以上。但他同时警告,由于机器存在温度节流,按次读取成本是更准确的指标。
值得注意的是,Torvalds承认其代码、测试程序及文档草稿均在LLM编码助手(Claude Code)指导下完成。早期版本曾因页面分配器无法识别等待宽限期的页面,在测试中触发OOM杀手。10月13日,Torvalds提交了仅对读取操作持续返回的folio进行延迟释放的修订版,报告称在Ryzen Threadripper处理器上,64线程每秒读取次数从1330万跃升至3.04亿,但他强调这并非真实负载水平。
修订版优化与性能表现
Shutsemau的修订版基于Linux 7.3-rc7,仅对被标记为“热”的folio启用新的PG_rcu_free标志。这意味着流式读取和冷数据不会被延迟,从而控制内存占用并减少释放操作的影响。此外,新补丁在内核触发OOM杀手或允许隔离失败前释放等待中的页面,并将无锁读取扩展到大folio和tmpfs。
在配备AMD Threadripper 7975WX处理器的64 vCPU KVM访客机测试中,Shutsemau展示了以下性能提升(默认启用CPU安全缓解措施):
- ext4文件系统:每秒读取次数从1500万-1570万提升至6890万-7010万;
- tmpfs:从160万-170万飙升至7100万-7200万;
- XFS:从1130万-1140万上升至2040万-2050万;
- 原始块设备:从1470万提升至2880万-2890万。
测试显示,单线程读取性能基本保持不变,而持续发生页错误的负载性能下降了4%-6%,这与Torvalds此前的RFC结果一致。若关闭安全缓解措施,早期版本曾将ext4读取性能推高至2.17亿-2.2亿次/秒。
目前该补丁集仍处于RFC阶段,存在未决事项。例如,第17号补丁提议从tmpfs读取中移除folio锁,Shutsemau认为此举安全,但仍需社区专家进一步确认。