slabtop 命令详解
更新时间:2026-09-17。「一个命令一个文档」系列,
slabtop属于性能观测与调试族。当free看到内核侧(buff/cache 或 slab)占用异常高时,用它定位是哪一类 slab 缓存在涨。
slab 是内核为小对象(dentry、inode、task_struct、网络结构等)准备的对象缓存,避免频繁分配释放。slabtop 把 /proc/slabinfo 解析成按内存排序的实时表。
一、常用法
bash
sudo slabtop # 实时刷新,默认按缓存大小排序
sudo slabtop -o # 只输出一次(脚本/截图用,不进入交互)
sudo slabtop -s c # 按缓存大小排序(默认);-s n 按对象数,-s a 按活动对象
sudo slabtop -d 5 # 5 秒刷新一次
cat /proc/slabinfo # 原始数据(部分内核需 CONFIG_SLABINFO,新版常无权限/不提供)二、关键列怎么读
| 列 | 含义 |
|---|---|
| OBJS | 该类对象总数 |
| ACTIVE | 正在使用的对象数 |
| OBJ SIZE | 单个对象大小(字节) |
| CACHE SIZE | 该 slab 缓存占用总内存(排内存主要看这列) |
| NAME | slab 名:dentry(目录项)、inode_cache/ext4_inode_cache、buffer_head 等 |
最常见的大头是 dentry / inode 缓存:访问过海量小文件(遍历几百万文件、构建、备份)后,dentry slab 会膨胀。这属于可回收的内核缓存,内存紧张时内核会回收,未必是泄漏。
三、判断"正常缓存"还是"泄漏"
bash
# 1. 先看总量里 slab 占多少
cat /proc/meminfo | grep -Ei 'Slab|SReclaimable|SUnreclaim'
# 2. slabtop -o 定位大头
sudo slabtop -o | head -20SReclaimable(可回收,多为 dentry/inode)高:通常是缓存,不是泄漏;可调节回收倾向:bash生产谨慎,过高会让路径查找变慢。sysctl vm.vfs_cache_pressure=200 # 默认100,调大更积极回收 dentry/inodeSUnreclaim(不可回收)持续单调增长且不回落:才要怀疑内核泄漏(某驱动/模块对象堆积),结合/proc/slabinfo增长曲线与内核版本排查。- 手动触发回收验证(仅测试/可接受抖动时):
echo 2 > /proc/sys/vm/drop_caches,dentry/inode 应明显下降。
容器内通常看不到宿主完整 slabinfo(只读自己的 namespace),需在宿主上跑 slabtop。新版内核默认不开放
/proc/slabinfo,slabtop 依赖它时可能报错,可改用/proc/meminfo+slabinfo替代或用 eBPF/perf 工具。
相关命令
进程内存用 pmap/
smem(见 free 深度),整体用 free/vmstat,内核参数用 sysctl,内核分配器背景见 concepts 内存章。
总结
slabtop = 把 /proc/slabinfo 按缓存大小排序实时展示:用 CACHE SIZE/NAME 找出占内存的 slab(多为 dentry/inode),再用 /proc/meminfo 的 SReclaimable(可回收,缓存)还是 SUnreclaim(不可回收,警惕泄漏)定性;可回收的 dentry 膨胀用 vfs_cache_pressure/drop_caches 验证,不可回收持续涨才排查内核泄漏。