A5站长网10月13日消息,Linux内核的页缓存里有一处拖了两年多的老瓶颈,最近被林纳斯·托瓦兹自己动手改了一遍。罕见的不只是改动本身,还有他在补丁说明里留的那段署名:代码、测试程序、他对问题清单背后的评审,以及这封信的初稿,都是在他指导下由Claude Code完成的,性能数据跑在他自己的机器上。外界注意到这件事的入口也很偶然——他在刷新自己的仓库时,发现里头多了一个分支noref-filemap-read-with-llm,后缀里的LLM不是玩笑。
问题出在多线程同时读同一个文件。每次读一小块数据,内核都要对支撑这一页的页缓存对象取一次引用,读完再释放掉。两步都是对同一个结构体的原子写,缓存行于是不停在核心之间弹跳。这个瓶颈最早由内核开发者马修·威尔科克斯在2024年从一个客户负载里提出来。托瓦兹在一台酷睿i7-8565U笔记本上复现:8个线程对同一页做16字节的读,仅这一行就占了跨核缓存命中转移的99.92%。
早前的尝试是先把数据拷进栈上的缓冲区、不做引用,之后再验证,结果卡在验证看不见的竞态上——页可能已经被释放,又在同一个索引位置重新插了进来。托瓦兹换了方向:不去检测竞态,而是把它消掉。离开页缓存的页对象要等一个RCU宽限期之后才回到页分配器,处在RCU读侧临界区的读者可以直接从内存页复制到用户缓冲区,不用引用、不用中转缓冲,读取大小也没有上限。
收益不小。在他那台四核八线程的笔记本上,8个线程读同一个文件时,每次读消耗的内核周期从约2950降到约725,吞吐从每秒约一千万次升到三千万次以上。单线程也有约一成的改善,用perf c2c测到的跨核缓存转移从30538次降到101次。代价是延迟释放意味着内存要等一阵才被复用,托瓦兹承认这是整套补丁里最没解决的那部分,所以八个补丁里有两个加了安全阀:某个处理器排队超过1024页,就让工作线程强制走一次加急宽限期把它们释放掉。
这还不是全部。差不多同一时间,他的仓库里多了一个叫assoc-array-fixes的标签。起因是开发者尼尔斯·奥尔罗格报告了关联数组库的一个缺陷,并附上补丁,托瓦兹觉得那段代码太难读,就用大模型帮着拆解,把几个又大又绕的函数分开。测试不光确认了原来报告的缺陷,还找出另外三个,都追溯到2013年这个库刚进内核的时候,已经趴了十几年。目前这些改动都没合并,分支挂在7.3-rc6上,也只在一台笔记本上测过。连内核开发里最保守的那部分工作都开始留下AI署名的消息,分量或许比那些数字更重。
A5创业网 版权所有