Linus Torvalds 借助 Claude Code 开发 Linux 页缓存修复补丁,在Ryzen Threadripper合成基准测试中实现最高23倍读取吞吐量提升,但在内核代码评审阶段,开发者发现存在竞态条件,补丁暂时不会合并进主线。这个页缓存引用计数瓶颈困扰内核开发者超过两年。

背景:页缓存争用瓶颈
早在2024年,Oracle内核工程师Matthew Wilcox在客户业务负载中发现该问题。在Linus的Core i7-8565U笔记本8线程测试中,folio引用计数争用占跨核HITM负载的99.92%。Linus本人花了18个月调试自己写的修复版本但一直存在缺陷,其他开发者的方案也陆续遇到各类问题。
新补丁方案在通用缓冲读路径移除folio引用计数操作;Linus同时提醒,该巨大性能提升仅出现在合成基准,真实业务场景增益会明显缩水。
Claude Code 参与补丁开发
Phoronix发现Linus内核仓库中一个少见的实验分支noref-filemap-read-with-llm,基于Linux 7.3-rc6,一共8个补丁。Linus自述,由Claude Code完成代码实现、测试用例与初始文档,在他指导下完成代码自查,基准测试由Linus亲自运行。
早期方案尝试不持有folio引用直接拷贝数据,事后校验有效性,会出现内存回收、页替换相关竞态。新版rcu-free-v3引入PG_rcu_free标记,依靠RCU延迟回收机制,保证用户态拷贝期间folio安全,前提是不发生缺页异常。
基准测试数据
| 测试环境 | 原版本 | 优化补丁 |
|---|---|---|
| 笔记本8线程 | 1000万读/秒,单次读取约2950内核周期 | 3300万读/秒,单次读取725内核周期 |
| Threadripper 64线程高争用 | 1330万读/秒,单次读取近20000内核周期 | 3.04亿读/秒,单次读取735内核周期 |
性能提升存在取舍:初代实现中,当CPU排队页面超过1024个就会触发加速宽限期;读取未映射用户页面会额外触发缺页,单线程16字节读取从4150周期上涨至6550周期,该性能回退是否延续到rcu-free-v3版本还未确认。
内核评审争议与后续
Wilcox质疑PG_rcu_free标记设计,提议改用page type方案,在RCU宽限期后回收非活跃列表folio,被Linus否决。Kiryl Shutsemau提出将标记限定在64位系统,该思路获得Arm内存维护者David Hildenbrand支持。
Kiryl还定位到filemap_read_rcu_batch()中的竞态问题:folio替换后再修改i_size,可能暴露从未写入的数据。Linus建议提前读取文件大小、合并folio校验逻辑,Kiryl已经把方案并入修订补丁。
目前Linus将该项目后续开发交给Kiryl Shutsemau继续推进。















