去年引入主线 Linux 内核的”sheaves”作为一种可选的基于 CPU 数组的缓存层。Sheaves 在 Linux 6.18 中重新合并,虽然它最初是一个可选的缓存层,但计划用 sheaves 替换更多的 CPU slabs/缓存。计划在即将到来的 Linux 7.0 周期中用 sheaves 替换更多的这些缓存。
本周已将替换 CPU 部分 slabs 为 sheaves 的补丁提交到 slab.git 的 slab/for-next Git 分支。
SUSE 工程师和 SLAB 维护者 Vlastimil Babka 将近期补丁系列中的工作总结为:
“Percpu sheaves 缓存最初是作为可选功能引入的,但最终目标是将其应用于所有缓存。这是下一步,将启用 Sheaves 用于所有缓存(除两个引导缓存外),然后移除 per cpu(部分)slabs 和大量相关代码。
除了(希望)提升性能外,这还移除了与无锁快速路径(使用 this_cpu_try_cmpxchg128/64)相关的较为复杂的代码及其与 PREEMPT_RT 或 kmalloc_nolock() 的复杂性。
使用 try_cmpxchg128/64 的无锁 slab freelist+计数器更新操作仍然存在,这对于释放远程 NUMA 对象而不重复 SLUB 的”异类”数组刷新至关重要,并允许在几乎无需节点 list_lock 的情况下将 sheaves 中的对象刷新到 slabs。
发送此 v4 版本,因为由于审查和-next 曝光,分支中积累了各种更改(见下表)。感谢所有审查!
之前使用 Per-CPU 部分缓存来加速对象分配和释放,但现在已被 sheaves 取代。
性能有望得到改善,但没有具体数字来量化这种扩展 sheaves 使用可能带来的性能影响。

这些补丁最初在 slab/for-7.0/sheaves 中预览,现在已提交到 slab/for-next,这项工作计划在 2 月份作为 Linux 6.20~7.0 周期的一部分提交。如果没有最后时刻出现的问题,我们将在下一个主线内核版本中看到这种扩展 sheaves 的使用。
Linuxeden开源社区