夜雨聆风学习资料网

ARTICLE · 1087866

Linux 6.12 源码深度剖析: ___slab_alloc

Linux 6.12 源码深度剖析: ___slab_alloc

内核申请内存,快路拿不到就得进慢路。___slab_alloc 负责重新填缓存。

它先查当前 CPU 的 slab。节点对得上、还有空闲对象就直接拿。没命中就放回旧 slab,再往 CPU 局部链表找。还空就上 Node 全局链表。最后才向伙伴系统要新页。

这里有个精妙设计叫 slab 冻结。Slab 绑给某个 CPU 后就被冻结。只有这个 CPU 能从中分配。别的 CPU 释放对象时,只能先把对象挂到临时链表。等解冻时再统一合并。这招把多核抢锁压到了最低。

可高并发一上来,Node 全局锁就成了瓶颈。128 核机器里,大量 CPU 卡在 get_partial 自旋。CPU 占用虚高,吞吐量跟着掉。跨核频繁释放还会让 slab 反复切换状态。老页残留少量对象没法回收,内存就这么被碎片蚕食了。

排查盯紧两处:ftrace 看 get_partial 耗时,slabinfo 看 active_objs 占比。比例低于三成,碎片就很严重了。

原文Linux 6.12 源码深度剖析: ___slab_alloc
作者提示: 个人观点,仅供参考
四川,43分钟前,

相关学习资料