Linus Torvalds 让 Claude Code 修复 Linux 页缓存,评审者随后发现竞态问题

Linux 创始人、长期担任首席维护者的 Linus Torvalds 借助 Anthropic 的 Claude Code,着手解决一个困扰开发者两年多的内核性能问题。周二,他提交了一组包含 10 个补丁的系列改动;在他自己的 Ryzen Threadripper 机器上跑合成基准测试时,吞吐量提升了 23 倍。
此前,Torvalds 自己写过一个修复页缓存引用计数瓶颈的版本,但那个版本有问题,他却一直用了 18 个月;其他开发者的方案也各自遇到了麻烦。新补丁从一条常见的缓冲读取路径中去掉了 folio 引用计数操作。不过 Torvalds 提醒说,在实际工作负载中,基准测试的收益会小得多。
评审者随后发现了一个竞态条件(race condition),并对内存回收提出了担忧。Torvalds 已将后续开发工作交给 Linux 内核开发者 Kiryl Shutsemau,此人此前也处理过同一个瓶颈问题。
Torvalds 自己写过一个修复页缓存引用计数瓶颈的版本,但那个版本有问题,他却一直用了 18 个月;其他开发者的方案也各自遇到了麻烦。
页缓存争用问题
据 Hardware Busters 报道,在 Torvalds 的 Core i7-8565U 笔记本上,八线程测试中,folio 引用计数争用占跨核负载 HITM 的 99.92%。
这个瓶颈是 2024 年由 Oracle 工程师、长期从事 Linux 内核内存管理的开发者 Matthew Wilcox 标记出来的,当时它在一个客户工作负载中暴露了出来。
Claude Code 编写补丁
周日,Phoronix 的 Michael Larabel 在 Torvalds 的代码树中发现了一个名为 noref-filemap-read-with-llm 的实验分支。Torvalds 的代码树中很少出现主开发分支之外的内容。
这套补丁共 8 个,基于 Linux 7.3-rc6,并详细说明了 Claude Code 做了什么。Torvalds 表示,这个助手编写了实现、测试和初步文档,并在他的指导下审查了代码。他亲自跑了基准测试,尽管此前曾批评开发者声称 AI 写了他们 99% 的代码。
早期方案在复制数据时不持有 folio 引用,事后才检查其有效性,因而在回收和替换过程中留下了竞态。随后的 10 补丁 rcu-free-v3 系列改用新的 PG_rcu_free 标志和 RCU 延迟回收,在用户空间复制期间保护 folio——前提是没有发生缺页。
早期方案在复制数据时不持有 folio 引用,事后才检查其有效性,因而在回收和替换过程中留下了竞态。
Threadripper 基准测试结果
最初的 8 补丁分支在 Torvalds 的笔记本上几乎将吞吐量提升了两倍,八线程性能从每秒 1000 万次读取提升到最高每秒 3300 万次,同时将每次读取的内核周期从约 2,950 降到 725。修订后的系列在他 64 线程的 Threadripper 上、高争用情况下带来了更大的提升:吞吐量从每秒 1330 万次跃升至每秒 3.04 亿次,每次读取的周期从近 20,000 降到 735。
最初的 8 补丁分支在 Torvalds 的笔记本上几乎将吞吐量提升了两倍,八线程性能从每秒 1000 万次读取提升到最高每秒 3300 万次,同时将每次读取的内核周期从约 2,950 降到 725。
性能提升伴随着取舍。据 Hardware Busters 报道,在第一个实现中,只要一个 CPU 排队超过 1,024 页,延迟回收就会强制触发一次加速宽限期。读取未映射的用户页时还会先触发一次额外的缺页,然后才回退到现有路径,使 16 字节单线程读取的周期从约 4,150 推高到 6,550。这一性能回退在 rcu-free-v3 中是否仍然存在,目前尚不清楚。
维护者对回收方案提出质疑
Wilcox 对新引入的 PG_rcu_freeflag 标志位提出质疑,建议改用页面类型(page type)来实现,并提出在 RCU 宽限期结束后再回收非活跃列表中的 folio。
Torvalds 否定了这两种方案。他的理由是:这个标志位必须在 folio 仍可能被映射到用户空间的时候设置;而非活跃列表回收无法覆盖 truncate 和 hole-punch 这两类操作。随后 Shutsemau 建议把这个标志位的使用限制在 64 位系统上,Arm 工程师、Linux 内存管理维护者 David Hildenbrand 对此表示支持。
Shutsemau 还发现了 filemap_read_rcu_batch() 中的一处竞态:先替换 folio、再扩展 i_size,可能把从未写入过的数据暴露出去。Torvalds 建议把文件大小的读取提前,并合并 folio 检查,Shutsemau 已将这些修改纳入修订后的补丁。