Linux 内核 SLAB/SLUB 分配器深度实战剖析
引言
在 Linux 内核开发中,内存管理是最核心也是最复杂的子系统之一。SLAB 分配器及其后继者 SLUB 通过对象缓存、着色机制和 NUMA 感知策略,将内存分配延迟降低到接近 O(1) 的水平。
1. SLAB 设计哲学
内核对象具有固定大小、生命周期短、初始化开销大的特征。传统伙伴系统以页为最小单位会产生内部碎片,SLAB 构建了对象缓存抽象。
2. SLUB 架构改进
SLUB 成为默认分配器的核心改进:元数据内联、每 CPU 缓存、partial 链表合并、简化 freelist 支持指针混淆防护。
3. 分配与释放路径
快速路径从 CPU freelist 摘取对象(纳秒级延迟)。慢路径依次检查 partial、node、alloc_pages,必要时触发 direct reclaim。
4. 缓存着色
通过 colour offset 避免缓存组冲突,高频遍历场景提升 15-30% 性能。
5. NUMA 感知分配
每个 node 维护独立 partial 链表,分配顺序:本地 node → 远程 node → 跨 node 新页。
6. kmem_cache 实战
使用 kmem_cache_create 创建模块专用缓存,指定 SLAB_HWCACHE_ALIGN 标志优化缓存行对齐。
7. 调试观测
通过 /proc/slabinfo + slabtop 建立内存基线,kmemleak 检测内存泄漏,red zone/poisoning 排查越界和 UAF。
8. 性能优化
task_struct 缓存调优、ext4 inode 加速、网络 skb 优化(RSS+XDP bypass)。
9. 演进方向
Linux 5.x~6.x 引入可破坏 freelist、BPF kfunc hook 实现无 recompile 的在线内存分析。
10. 实践要点
小对象用 kmem_cache,调试开 poison,生产用 slabinfo 监控,NUMA 系统绑定同节点,drgn/crash 离线分析。

发表评论 取消回复