去年引入主线Linux内核的"sheaves"作为一种可选的基于每CPU数组的缓存层。该功能已于Linux 6.18版本合并,虽然最初作为可选缓存层出现,但计划是用sheaves替换更多CPU slabs/缓存。在即将到来的Linux 7.0开发周期中,已安排用sheaves替换更多这类缓存。
本周进入slab.Git的slab/for-next Git分支的补丁集,实现了用sheaves替换CPU部分slabs的功能。
SUSE工程师兼SLAB维护者Vlastimil Babka在最近的补丁系列中总结道:
"每CPU sheaves缓存最初作为可选功能引入,但最终目标是将所有缓存迁移至此。这是实现该目标的关键一步——为所有缓存启用sheaves(除两个引导缓存外),随后移除每CPU(部分)slabs及大量相关代码。
除了(预期中的)性能提升,此举还移除了涉及无锁快速路径(使用this_cpu_try_cmpxchg128/64)的复杂代码及其在PREEMPT_RT或kmalloc_nolock()场景下的复杂性。
基于try_cmpxchg128/64的无锁slab空闲列表+计数器更新操作得以保留,这对于释放远程NUMA对象(无需重复SLUB的'alien'数组刷新)至关重要,同时支持在多数情况下无需节点list_lock即可将对象从sheaves刷新到slabs。
发布v4版本是因为分支中积累了来自代码审查和-next测试的各种变更(详见下方列表)。感谢所有审阅者!"
每CPU部分缓存曾用于加速对象分配与释放,现已被sheaves完全取代。
虽然"预期"会有性能提升,但目前尚未提供具体数据来量化这种扩展使用sheaves可能带来的性能影响。
这些补丁最初暂存于slab/for-7.0/sheaves分支,现已进入slab/for-next分支,预计将于2月作为Linux 6.20~7.0开发周期的一部分提交。
若无重大突发问题,我们将在下一个主线内核版本中看到这种扩展应用的sheaves功能。