资讯动态

slub kmem_cache

发布时间:2026/10/23 8:39:10 来源:尧图企业网站定制
定义了 SLUB 的统计计数器集合每个值对应一个struct kmem_cache上的计数字段。它把 SLUB 内部所有关键的分配/释放/搬运动作分类计数暴露到 sysfs/debugfs 供性能分析和调优。一、整体作用SLUB 在kmem_cache里有一个数组unsigned long stat[NR_SLUB_STAT_ITEMS]; // 或 per-CPU 版本每次发生某类事件就s-stat[ALLOC_FASTPATH]等。通过/sys/kernel/slab/cache/alloc_calls、free_calls、或CONFIG_SLUB_STATS下的/sys/kernel/slab/cache/属性可以看到这些计数。用途判断分配/释放走的是快路还是慢路判断 partial 列表、CPU partial、页面分配器的压力分布定位性能瓶颈如慢路过多、CPU partial 频繁 drain评估调试标志对性能的影响下面按语义分组。二、分配路径计数枚举含义ALLOC_FASTPATH从当前 CPU slab 的 freelist直接拿到对象——最快的无锁路径ALLOC_SLOWPATH需要获取新的 CPU slab 才能分配——进入慢路径ALLOC_FROM_PARTIALCPU slab 是从per-node partial 列表取得的ALLOC_SLABCPU slab 是直接向伙伴系统申请新页得到的ALLOC_REFILL从当前 slab 页的 freelist补充 CPU freelist同一页内部补充ALLOC_NODE_MISMATCH分配的 slab 节点与请求节点不匹配需要切换 CPU slab这一组完整刻画了一次分配对象的来源ALLOC_FASTPATH → 最快CPU freelist 有货 ALLOC_REFILL → CPU freelist 空但从当前页还能补 ALLOC_FROM_PARTIAL → 当前页也空了从 node partial 拿 ALLOC_SLAB → partial 也没有向伙伴系统要新页 ALLOC_NODE_MISMATCH → 拿到/需要的页节点不符换 CPU slab ALLOC_SLOWPATH → 上述非 fastpath 的总入口ALLOC_FASTPATH比例越高SLUB 越高效。三、释放路径计数枚举含义FREE_FASTPATH释放到当前 CPU slab——无锁快路径FREE_SLOWPATH释放到非当前 CPU slab——需要加锁的慢路径FREE_FROZEN释放到frozen slab被某 CPU 冻结、不在 partial 列表上的页FREE_ADD_PARTIAL该次释放使 slab被加入 partial 列表FREE_REMOVE_PARTIAL该次释放是最后一个对象slab 从 partial 移除FREE_SLABslab整页归还给伙伴系统关键点FREE_FASTPATHvsFREE_SLOWPATH区分对象是否属于当前 CPU 正在用的 slab。前者无锁后者要动 per-node 锁性能差距明显。FREE_FROZENfrozen 是 SLUB 的中间状态——一个 slab 被某 CPU 独占、从 partial 列表摘下但还没成为“当前 CPU slab”。释放到 frozen slab 说明跨 CPU 释放或 deactivate 过程中的情况。FREE_ADD_PARTIAL/FREE_REMOVE_PARTIAL/FREE_SLAB刻画释放导致 slab状态迁移最终可能整页回收。四、CPU slab 停用deactivate相关当一个 CPU 不再使用某个 slab比如切换 CPU slab、CPU 下线、cache 销毁时要把这个 slab “停用”并放回 partial 列表或释放。这一组计数描述停用时 slab 的状态和去向枚举含义CPUSLAB_FLUSH放弃当前 CPU slab主动 flush如切换时DEACTIVATE_FULL停用时该 slab 是满的无空闲对象DEACTIVATE_EMPTY停用时该 slab 是空的全部空闲DEACTIVATE_TO_HEADslab 被放到 partial 列表头部DEACTIVATE_TO_TAILslab 被放到 partial 列表尾部DEACTIVATE_REMOTE_FREES该 slab 含其他 CPU 远程释放的对象DEACTIVATE_BYPASS隐式停用bypass绕过常规 deactivate 流程用途DEACTIVATE_FULL多说明 CPU slab 常被填满后才换局部性好。DEACTIVATE_EMPTY多说明 slab 常被用空可能分配/释放模式分散。TO_HEADvsTO_TAILSLUB 按 slab 空闲程度决定放头还是放尾计数反映策略命中情况。REMOTE_FREES跨 CPU 释放频繁时局部性差性能可能受影响。BYPASS隐式路径通常出现在特殊场景。五、CPU partial 相关前面提过CONFIG_SLUB_CPU_PARTIAL每个 CPU 除了当前 slab还缓存一批 partial slab。这一组计数描述 CPU partial 的流入流出枚举含义CPU_PARTIAL_ALLOC分配时使用了 CPU partial从 CPU partial 取到 slabCPU_PARTIAL_FREE释放时补充了 CPU partial把 slab 挂到 CPU partialCPU_PARTIAL_NODE从node partial 列表补充 CPU partialCPU_PARTIAL_DRAIN把CPU partial 排空回 node partial如超限时用途CPU_PARTIAL_ALLOC高CPU partial 命中好减少了 node 锁竞争。CPU_PARTIAL_NODE高本地 partial 不够频繁向 node 要。CPU_PARTIAL_DRAIN高CPU partial 经常超限被排空说明缓存策略可能需要调cpu_partial。六、cmpxchg 失败计数枚举含义CMPXCHG_DOUBLE_CPU_FAILthis_cpu_cmpxchg_double失败次数CMPXCHG_DOUBLE_FAILslab freelist 更新时cmpxchg失败次数这两个衡量无锁路径的竞争程度cmpxchg是无锁 CAS失败意味着有并发修改需要重试。CMPXCHG_DOUBLE_CPU_FAIL针对 per-CPU 的 double cmpxchg更新 freelist 计数器。CMPXCHG_DOUBLE_FAIL针对 slab freelist 更新的 cmpxchg。失败率高说明并发冲突多可能影响性能也可能促使 SLUB 回退到加锁路径。七、order 回退枚举含义ORDER_FALLBACKorder 回退发生次数calculate_order()会优先选一个“对象数合适、order 尽量小”的方案。若理想 order 分配失败内存碎片、水位不足SLUB 会回退到更大的 order或不同的对象数方案。这个计数反映内存压力或碎片导致的分配妥协。八、NR_SLUB_STAT_ITEMSNR_SLUB_STAT_ITEMS数组大小哨兵必须放在最后。用于定义stat[NR_SLUB_STAT_ITEMS]数组遍历输出所有计数保证编译期维度正确九、分组总结图分配 ALLOC_FASTPATH ──► ALLOC_REFILL ──► ALLOC_FROM_PARTIAL ──► ALLOC_SLAB └─ ALLOC_NODE_MISMATCH ALLOC_SLOWPATH 后几者总和 释放 FREE_FASTPATH / FREE_SLOWPATH / FREE_FROZEN └─ FREE_ADD_PARTIAL / FREE_REMOVE_PARTIAL / FREE_SLAB CPU slab 停用 CPUSLAB_FLUSH DEACTIVATE_FULL / EMPTY / TO_HEAD / TO_TAIL / REMOTE_FREES / BYPASS CPU partial CPU_PARTIAL_ALLOC / FREE / NODE / DRAIN 无锁竞争 CMPXCHG_DOUBLE_CPU_FAIL / CMPXCHG_DOUBLE_FAIL 分配妥协 ORDER_FALLBACK十、一句话总结enum stat_item是 SLUB 的内部事件计数器清单覆盖分配来源fastpath/refill/partial/new page、释放去向fastpath/slowpath/frozen/partial/slab、CPU slab 停用状态、CPU partial 流转、cmpxchg 竞争失败和 order 回退。它们通过/sys/kernel/slab/暴露是分析 SLUB 行为和性能的核心依据。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑