slabtop:看内核 slab 占用与缓存回收
更新时间:2026-09-19。当 free 显示内存被大量占用、但应用堆并不大时,一部分往往是内核 slab 缓存(最常见是 dentry/inode 缓存)。slabtop 实时列出这些内核对象缓存各占多少。
一、命令与输出
bash
sudo slabtop -o -s c # -o 单次输出(适合脚本),-s c 按缓存大小排序
sudo slabtop -d 2 # 每 2 秒刷新(交互默认 3s)bash
Active / Total Objects (% active)
OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME
980k 901k 92% 0.19K 49000 20 78400K dentry
420k 402k 95% 0.74K 21000 20 67200K ext4_inode_cache
...| 列 | 含义 |
|---|---|
| OBJS | 该类对象总数 |
| ACTIVE | 正在使用的数量(其余可回收) |
| OBJ SIZE | 单个对象大小 |
| CACHE SIZE | 该 slab 缓存总占用(最关注) |
| NAME | 缓存类型:dentry(目录项)、*_inode_cache(inode)等 |
dentry、ext4_inode_cache、buffer_head 这类缓存记录「路径→inode」「文件元数据」,访问过海量小文件(备份、包管理、代码仓库扫描)后会变得非常大。
二、slab 与 page cache 的关系
- page cache 缓存文件数据内容(见 free 深入)。
- slab 里的 dentry/inode 缓存记录路径解析和文件元数据对象,属于内核对象分配器(slub/slab)。
- 在
/proc/meminfo中:SReclaimable是可回收的 slab(大多数 dentry/inode 属于此类),SUnreclaim是不可回收的(真正的内核分配)。
bash
grep -E 'Slab|SReclaimable|SUnreclaim|Cached|MemAvailable' /proc/meminfoSReclaimable 很大通常不是泄漏——内存紧张时内核会自动回收;只有当它挤占 available、或伴随异常持续增长不回落时才需要介入。
三、什么时候要回收 / 排查
- 海量小文件操作后 dentry/inode 暴涨:大量编译、解包、扫描后缓存膨胀是正常的缓存收益,一般让内核自动管理。
- available 长期很低、业务受影响:先确认是否真有内存压力(vmstat 看 si/so、回收扫描),而不是一看到 cache 大就清。
- 基准测试要冷缓存:显式释放可回收 slab 和页缓存,见 drop_caches:
bash
sync
echo 2 | sudo tee /proc/sys/vm/drop_caches # 2 = dentry/inode(slab 可回收项)
echo 3 | sudo tee /proc/sys/vm/drop_caches # 3 = 页缓存 + slabdrop_caches 只释放「干净、可重建」的对象,不丢数据;但清完后路径解析/文件访问会暂时变慢(冷缓存),生产慎用。
四、异常增长怎么定位
SUnreclaim持续单调上涨、重启才回落:可能是内核/驱动对象泄漏,结合 /proc/slabinfo 的版本差异和内核版本排查。- 某类文件系统 inode cache 异常:对应大量被打开/创建但缓存未回收的文件,检查小文件风暴、容器层/overlay、日志轮转。
- 容器看到的 slab 是宿主全局的,单容器无法单独回收 dentry(cgroup v1 有 memcg kernel memory 限制,v2 通过 memory.stat 的 kernel 统计观察)。
坑
- 把 SReclaimable 的 dentry/inode 缓存当内存泄漏,盲目定时 drop_caches,反而周期性制造冷路径性能下降。
- 只看 slabtop 总量不看 available 和 si/so,在没有回收压力时过度干预。
- 在高负载生产清缓存,元数据/数据冷查同时打到磁盘引发抖动。
- 以为容器内能独立清宿主 slab,实际影响范围是全局的。
总结
slabtop 按对象类型展示内核 slab 缓存占用,最常见的大头是记录目录项和文件元数据的 dentry 与 inode cache;它们在 /proc/meminfo 里大多计入可回收的 SReclaimable,海量小文件访问后变大属于正常缓存、内存紧张时内核会自动回收,只有 available 真正吃紧或 SUnreclaim 单调增长才需处理;要做冷缓存基准可用 sync 加 drop_caches 2/3 安全释放,但生产环境慎用,容器中还要注意 slab 是宿主全局资源。