Slabtop 是 Linux 内核实时监控 slab 分配器状态的工具,通过观察 dentry、inode_cache 等缓存的 OBJS、SLABS、SIZE 等指标,可识别内核对象泄漏或内存争用,进而间接判断是否拖慢高并发 I/O 或频繁系统调用的进程。

Slabtop 是 Linux 内核提供的实时查看 slab 分配器状态的工具,主要用于监控内核对象缓存(如 inode、dentry、task_struct 等)的内存使用情况。它本身不直接显示“对某个进程性能的影响”,但能帮助你识别内核缓存是否异常膨胀、是否存在内存争用或对象泄漏,从而间接判断是否拖慢了进程——尤其是高并发 I/O 或频繁系统调用的进程。
Slabtop 能告诉你哪些关键信息
运行 slabtop -o(按对象数量排序)或 slabtop -s c(按缓存大小排序),重点关注以下几列:
- OBJS:当前已分配的活跃对象数 —— 若某缓存(如 dentry、inode)持续增长且不回收,可能说明文件操作密集或存在未关闭的句柄;
- OBJ/SLAB:每个 slab 块包含的对象数 —— 过小可能导致 slab 数量激增,增加管理开销;
- SLABS:已分配的 slab 块总数 —— 结合 OBJS 可估算实际内存占用;
- SIZE:单个对象大小(字节)—— 帮助评估缓存膨胀的实际内存代价;
- NUMA节点分布(如有)—— 若某节点 slab 高度集中,可能引发跨节点访问延迟,影响绑核进程性能。
哪些 slab 缓存异常最可能拖慢进程
以下缓存长期高位运行时,常与性能问题相关:
- dentry:目录项缓存。若 OBJS > 数千万且持续上升,说明路径解析频繁或存在大量短生命周期文件访问(如日志轮转、临时文件),可能加剧 VFS 层锁竞争,使 open()/stat() 类系统调用变慢;
- inode_cache:索引节点缓存。与 dentry 类似,异常高值常伴随大量文件打开/创建,易触发 writeback 压力或导致 vfs_cache_pressure 设置不合理;
-
task_struct:进程描述符。若 OBJS 显著高于当前进程数(
ps aux | wc -l),可能有僵尸进程残留或 fork() 泄漏,影响调度器效率; - ext4_inode_cache(或其他文件系统专属缓存):说明该文件系统元数据压力大,可能拖慢 sync、fsync 或文件写入密集型进程。
结合其他工具交叉验证影响
仅看 slabtop 不足以断定“进程变慢”,需联动分析:
- 用 pidstat -w 查看目标进程的上下文切换次数(cswch/s),若偏高且 dentry/inode 缓存也高,可能是 VFS 锁争用所致;
- 用 perf record -e 'sched:sched_switch' -p PID 捕获调度事件,观察是否频繁因 slab 分配失败(如 __slab_alloc 报错)而阻塞;
- 检查 /proc/sys/vm/vfs_cache_pressure:默认值为 100,若远低于此(如 10),内核会过度保留 dentry/inode,加剧内存压力;适当调高(如 200)可加快回收,缓解 OOM 风险;
- 对比 cat /proc/meminfo | grep SReclaimable:该值反映可回收 slab 内存总量。若接近总内存 30% 以上且持续不降,说明缓存老化机制失效,可能影响整体内存可用性。
简单有效的缓解建议
发现可疑缓存后,可尝试以下低风险操作:
- 手动触发 slab 回收:echo 2 > /proc/sys/vm/drop_caches(仅释放可回收 slab,不影响脏页);
- 调整 vfs_cache_pressure:sysctl vm.vfs_cache_pressure=200(临时生效),或写入
/etc/sysctl.conf持久化; - 排查应用层文件操作:用 lsof -p PID 检查进程打开的文件数,确认是否存在未关闭 fd 或循环创建临时文件;
- 升级内核或补丁:某些 slab 泄漏问题(如特定 ext4 场景)已在较新内核中修复,建议保持内核版本更新。











