slabtop默认不显示详细对象分布,因其仅是/proc/slabinfo的实时终端视图,而内核未向用户空间暴露对象粒度信息;它只显示各slab cache总量(active_objs/num_objs),命名如dentry、kmalloc-128已隐含类型与大小特征。

slabtop 命令为什么默认不显示详细对象分布
slabtop 默认以“活跃对象数”排序,只显示每个 slab cache 的总量(active_objs / num_objs),不展开内部对象类型或大小分布。它本质是 /proc/slabinfo 的实时终端视图,而内核本身不把“对象粒度分布”暴露给用户空间——所以你不会看到某个 kmalloc-64 里哪些具体结构体占了哪些 slot。
真正能反映“对象分布”的,其实是 slab cache 的命名本身:比如 dentry、inode_cache、task_struct 这些名字直接对应内核中分配的缓存类型;而 kmalloc-128 这类则表示通用内存池中 128 字节对齐的块。
- 运行
slabtop -o(o 代表 “order by”,不是 “object detail”)只是切换排序字段,不会增加信息维度 -
slabtop -s c按缓存名排序,方便快速定位特定类型(如查ext4_inode_cache) - 按
slabtop -s a(活跃对象数)或-s b(字节数)排序,才能看出哪个缓存实际吃内存最多
怎么从 /proc/slabinfo 手动补全 slabtop 看不到的信息
/proc/slabinfo 是 slabtop 的数据源,但它多出几列关键字段:objects(总对象数)、objsize(单个对象字节数)、pagesperslab(每 slab 页数)、oom_score_adj(部分新内核有)。这些决定了真实内存占用和碎片倾向。
例如同一缓存 kmalloc-192 在不同内核版本 objsize 可能是 192 或 193(因对齐或元数据),直接关系到 slab 内存利用率。
- 用
awk '{print $1, $3, $4, $5}' /proc/slabinfo | sort -k3nr | head -10查 objsize 最大的前 10 个缓存 - 用
grep "dentry\|inode" /proc/slabinfo快速过滤文件系统相关缓存,比在slabtop里翻页更准 - 注意:若
/proc/slabinfo显示0 0 0,说明该缓存已销毁或被 shrinker 回收,slabtop也不会再列出它
slabtop 常见卡顿、无响应或数据为空的原因
slabtop 依赖周期性读取 /proc/slabinfo,而该文件在高并发 slab 分配/释放时可能短暂阻塞,尤其在低配虚拟机或开启 slab_merge 的旧内核上。
典型现象是命令启动后停住、Ctrl+C 后才输出一行、或者所有数值恒为 0 —— 这往往不是权限问题,而是内核未启用 slab debug 或当前没有活跃 slab 缓存。
- 确认内核编译选项:
zcat /proc/config.gz | grep CONFIG_SLAB(需 CONFIG_SLAB 或 CONFIG_SLUB) - 检查是否被 cgroup v2 的 memory controller 干扰:
cat /sys/fs/cgroup/memory.max若为max以外值,可能限制 slab 统计精度 - 某些容器环境(如 docker run --memory=...)会隐藏部分 slab 信息,此时
slabtop显示空或极简,但宿主机上正常
SLUB vs SLAB:slabtop 输出差异在哪
现代 Linux 默认用 SLUB 分配器(CONFIG_SLUB=y),而传统 SLAB(CONFIG_SLAB=y)已基本弃用。两者在 slabtop 中表现一致,但底层字段含义不同:
- SLUB 下
pagesperslab实际是“每个 slab 的页数”,但一个 slab 可能跨多个物理页(由order决定),slabtop不显示 order - SLUB 合并相似大小的 kmalloc 缓存(如
kmalloc-96和kmalloc-128可能共用同一个 slab),导致objsize看似不准,实则是 SLUB 的优化行为 - SLAB 分配器下
/proc/slabinfo多一列align,SLUB 则没有;slabtop对两者都隐藏该细节
如果你看到大量 kmalloc- 开头的缓存但 objsize 和命名不符,大概率是 SLUB 的 size class 合并策略在起作用,不是工具 bug。
真正要定位对象级分布,得结合 kmemleak 或 eBPF 工具(如 bpftrace -e 'kprobe:__kmem_cache_alloc_node { printf("cache: %s\n", str(args->s->name)); }'),slabtop 只负责告诉你“哪块地最挤”,不负责画每栋楼的户型图。


















