- 文档
- 教程
【免费下载链接】linux-command
Linux命令大全搜索工具,内容包含Linux命令手册、详解、学习、搜集。https://git.io/linux
本文基于开源仓库 linux-command 中收录的
slabtop命令文档展开,全面讲解该命令的语法、选项、排序标准、输出字段含义,并结合内核 Slab 分配器的原理与仓库的索引结构,帮助你在日常运维中快速定位内核对象缓存异常、内存泄漏等隐患,掌握一套可落地的内核内存观测方法。
命令概述:slabtop 能做什么
slabtop是 procps 工具集中的一个实时监控命令,它以动态刷新的方式显示内核slab 缓冲区的细节信息。在 Linux 内核中,slab 分配器负责管理大量重复创建、销毁的内核对象(如文件描述符、inode、dentry 等),slabtop正是面向这些对象缓存的一扇"观察窗口"。
它与free、top的定位不同:top关注进程级资源占用,free关注整机内存水位,而slabtop精确到"哪一种内核对象缓存占用了多少内存、活跃度如何"。在排查内核内存泄漏、buffer_head/dentry_cache异常膨胀、inode 缓存不释放等经典问题时,slabtop往往是第一手证据来源。
在 linux-command 项目中,slabtop已被收录为 600 多个 Linux 命令条目之一,其在 dist/data.json 中的索引条目(约第 2392 行)记录了命令名slabtop、页面路径/slabtop与简介"实时显示内核slab内存缓存信息",你可以在 Web 版命令速查中直接检索到本文对应的完整文档。
语法
slabtop(选项)该命令的语法非常简单,所有行为都通过选项控制,无位置参数。未指定任何选项时,slabtop会以交互式、每 3 秒刷新一次的默认模式持续运行,直到按q退出。
选项详解
--delay=n, -d n:每n秒更新一次显示的信息,默认是每3秒; --sort=S, -s S:指定排序标准进行排序(排序标准,参照下面或者man手册); --once, -o:显示一次后退出; --version, -V:显示版本; --help:显示帮助信息。逐项说明如下:
| 选项 | 长选项 | 作用 | 使用提示 |
|---|---|---|---|
-d n | --delay=n | 每 n 秒刷新一次显示信息 | 默认值为 3 秒;在排查问题时可将 n 调小(如-d 1)以观察对象数快速变化的瞬时行为,也可配合脚本将 n 调大以减少输出频率 |
-s S | --sort=S | 指定排序标准 | S 取值为下面"排序标准"一节中的单字母,例如-s n按缓存名排序、-s u按缓存利用率排序 |
-o | --once | 仅显示一次后退出 | 最适合脚本化采集与定时监控,避免交互模式下无法直接管道输出 |
-V | --version | 显示版本信息 | 用于确认 procps 工具版本,判断可用选项集合 |
-h | --help | 显示帮助信息 | 可快速查看全部选项与默认值 |
实际运维中最常用的组合是slabtop -o -s u(一次性输出并按缓存利用率排序)与slabtop -d 1(1 秒高频刷新,观察波动)。
排序标准:单字母排序键
排序标准通过-s S指定,共 10 个单字母键,分别对应输出表中的不同列指标:
| 排序键 | 含义 | 对应输出列 |
|---|---|---|
a | 按活跃对象数排序(number of active objects) | ACTIVE |
b | 按每个 slab 中的对象数排序(objects per slab) | OBJ/SLAB |
c | 按缓存大小排序(cache size) | CACHE SIZE |
l | 按 slab 数量排序(number of slabs) | SLABS |
v | 按活跃 slab 数排序(number of active slabs) | 头部统计中的 Active Slabs |
n | 按缓存名称排序(name) | NAME |
o | 按对象总数排序(number of objects) | OBJS |
p | 按每个 slab 的页数排序(pages per slab) | — |
s | 按对象大小排序(object size) | OBJ SIZE |
u | 按缓存利用率排序(cache utilization) | USE |
其中u(利用率)与a(活跃对象数)在实战中最为常用:前者能一眼挑出"对象总数巨大但利用率极低"的可疑缓存,后者能直接锁定正在被大量使用的热点对象类型。完整标准清单也可以查阅该命令的 man 手册确认。
头部统计信息解读
slabtop输出的前五行是系统级汇总信息,反映所有 slab 缓存的整体状态:
Active / Total Objects (% used) : 897519 / 1245930 (72.0%) Active / Total Slabs (% used) : 38605 / 38605 (100.0%) Active / Total Caches (% used) : 94 / 145 (64.8%) Active / Total Size (% used) : 129558.22K / 153432.58K (84.4%) Minimum / Average / Maximum Object : 0.01K / 0.12K / 128.00K- Active / Total Objects:当前活跃(被引用)对象数 / 缓存中分配的对象总数,
% used为活跃占比。活跃占比长期偏低说明存在大量空闲但未回收的对象。 - Active / Total Slabs:活跃 slab 数 / slab 总数。Slab 是分配对象的基本物理单元(一页或多页连续内存),该行 100% 说明所有 slab 都处于被引用状态。
- Active / Total Caches:活跃缓存数 / 系统全部缓存种类数。内核会为每种对象类型建立独立缓存,
64.8%表示 145 种缓存中 94 种处于活跃状态。 - Active / Total Size:活跃内存总量 / 缓存占用总内存量。这是 slab 层真实占用的物理内存规模,可用于评估 slab 内存占整机内存的比例。
- Minimum / Average / Maximum Object:对象大小的最小、平均、最大值,帮助判断缓存中对象尺寸分布是否合理。
输出字段详解:一行读懂一种缓存
slabtop的主体是一个表格,每一行对应一种内核对象缓存,字段如下:
OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME 440136 171471 38% 0.05K 6113 72 24452K buffer_head| 字段 | 含义 | 解读要点 |
|---|---|---|
OBJS | 该缓存中分配的对象总数 | 对象数 × 对象大小 ≈ 缓存内存规模 |
ACTIVE | 当前活跃(被引用)的对象数 | 与 OBJS 的差值即空闲对象 |
USE | 活跃对象占比(ACTIVE/OBJS) | 利用率低往往意味着对象长期滞留未释放 |
OBJ SIZE | 单个对象大小 | 结合对象数可估算内存占用 |
SLABS | 组成该缓存的 slab 数量 | 每个 slab 包含固定数量的对象 |
OBJ/SLAB | 每个 slab 内包含的对象数 | 与对象大小共同决定 slab 的页面构成 |
CACHE SIZE | 该缓存占用的总内存(含对象与 slab 管理开销) | 反映真实内存占用 |
NAME | 缓存名称,即内核对象类型名 | 常见如buffer_head、dentry_cache、inode_cache、radix_tree_node等 |
其中NAME是排查的关键入口:buffer_head膨胀通常与块设备 I/O、文件系统元数据操作相关;dentry_cache异常增长常指向目录项缓存未及时回收;inode_cache偏高往往伴随大量文件被打开后未关闭。
内核知识扩展:Slab 分配器原理
内核模块在分配资源时,为提高效率和资源利用率,都是通过 slab 来分配的。通过 slab 信息,再配合源码可以粗略了解系统的运行情况——比如某个资源是否异常增多、是否存在泄漏。Linux 通过/proc/slabinfo文件向用户暴露 slab 的使用情况。
Linux 使用的 slab 分配器,其基础是 Jeff Bonwick 为 SunOS 操作系统首次引入的一种算法。Jeff 的分配器围绕对象缓存展开:在内核中,会为有限的对象集(例如文件描述符和其他常见结构)分配大量内存。Jeff 发现,对内核中普通对象进行初始化所需的时间,超过了对其进行分配和释放所需的时间,因此他的结论是:不应该将内存释放回一个全局的内存池,而应将内存保持为针对特定目的而初始化的状态。Linux slab 分配器沿用了这一思想并加以扩展,构建了一个在空间和时间上都高效的分配器。
理解这一设计对使用slabtop至关重要:
- 对象缓存复用:内核为每种对象类型维护独立的缓存,对象被释放后并不归还全局内存池,而是留在缓存中保持已初始化状态,下次分配直接复用,省去重复初始化开销——这正是
USE列会长期低于 100% 的原因。 /proc/slabinfo是数据源:slabtop显示的所有数据均来自/proc/slabinfo,你可以直接cat /proc/slabinfo查看原始文本格式数据,两处信息一一对应。- 排查思路:当某类对象的
OBJS持续增长而ACTIVE不增长时,说明对象被分配后未被正确释放,存在泄漏嫌疑;当OBJS很大而USE很低时,说明大量空闲对象滞留在缓存中,可能触发内存占用偏高。
实战示例与结果解读
直接执行slabtop,输出如下(示例为实际运行时输出):
slabtop Active / Total Objects (% used) : 897519 / 1245930 (72.0%) Active / Total Slabs (% used) : 38605 / 38605 (100.0%) Active / Total Caches (% used) : 94 / 145 (64.8%) Active / Total Size (% used) : 129558.22K / 153432.58K (84.4%) Minimum / Average / Maximum Object : 0.01K / 0.12K / 128.00K OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME 440136 171471 38% 0.05K 6113 72 24452K buffer_head 190086 148576 78% 0.05K 2437 78 9748K selinux_inode_security 151840 146366 96% 0.48K 18980 8 75920K ext3_inode_cache 144333 144143 99% 0.02K 711 203 2844K avtab_node 130529 128488 98% 0.13K 4501 29 18004K dentry_cache 99214 99071 99% 0.03K 878 113 3512K size-32 43834 28475 64% 0.27K 3131 14 12524K radix_tree_node 17818 9450 53% 0.06K 302 59 1208K size-64 4602 4562 99% 0.05K 59 78 236K sysfs_dir_cache 3220 2855 88% 0.08K 70 46 280K vm_area_struct 2460 2114 85% 0.12K 82 30 328K size-128 1564 1461 93% 0.04K 17 92 68K Acpi-Operand 1540 1540 100% 0.33K 140 11 560K inode_cache 1524 466 30% 0.01K 6 254 24K anon_vma 1440 515 35% 0.05K 20 72 80K avc_node 1440 1154 80% 0.19K 72 20 288K filp 1170 1023 87% 0.05K 15 78 60K ext3_xattr 845 724 85% 0.02K 5 169 20K Acpi-Namespace 638 315 49% 0.35K 58 11 232K proc_inode_cache 450 434 96% 0.25K 30 15 120K size-256 424 386 91% 0.50K 53 8 212K size-512 312 107 34% 0.05K 4 78 16K delayacct_cache 306 284 92% 0.43K 34 9 136K shmem_inode_cache 303 108 35% 0.04K 3 101 12K pid 300 261 87% 0.19K 15 20 60K skbuff_head_cache 300 300 100% 0.12K 10 30 40K bio 260 260 100% 32.00K 260 1 8320K size-32768 254 6 2% 0.01K 1 254 4K revoke_table 236 55 23% 0.06K 4 59 16K fs_cache 216 203 93% 1.00K 54 4 216K size-1024 214 214 100% 2.00K 107 2 428K size-2048 203 83 40% 0.02K 1 203 4K biovec-1以上输出可以解读出几个典型场景:
- 热点对象:
buffer_head对象总数 440136 个,占用约 24MB,但利用率仅 38%,说明存在大量空闲的 buffer_head 对象滞留;ext3_inode_cache占用 75MB 且利用率 96%,是当时系统中占用 slab 内存最大的活跃缓存,与文件系统 inode 的大量使用吻合。 - 异常信号:
revoke_table利用率仅 2%(254 个对象中仅 6 个活跃)、fs_cache利用率 23%,这类"对象多、活跃少"的缓存是需要留意的方向,可能伴随内核回收不及时。 - 按需复用的通用缓存:
size-32、size-64、size-128、size-256等是内核按对象大小划分的通用缓存(kmalloc 后备缓存),它们利用率普遍较高(99%),是内核小内存分配的常态表现。
与仓库内容的结合:如何查阅与复用本文档
在 linux-command 仓库中,本文对应源文件为 command/slabtop.md,所有命令文档均以统一的 Markdown 结构组织(命令名 + 补充说明 + 语法 + 选项 + 实例)。仓库通过构建脚本将command/目录下的文档渲染为 Web 页面:文档的索引数据位于 dist/data.json(slabtop条目记录了名称、路径/slabtop与简介),页面渲染模板为 template/details.ejs,读者可直接在 Web 版命令速查中按命令名检索本文内容。
如果你需要将slabtop纳入监控脚本,推荐组合使用-o与-s选项实现非交互式采集,例如:
# 一次性输出,按缓存利用率降序排列,便于快速定位异常缓存 slabtop -o -s u # 每 5 秒输出一次缓存大小 Top 信息,可结合 cron 或监控系统定时采集 slabtop -o -s c同时可搭配free(查看整机内存)、vmstat(查看系统级内存与 I/O 指标)以及直接读取cat /proc/slabinfo交叉验证,形成从"整机内存 → 内核缓存 → 具体对象类型"的完整排查链路。需要说明的是,slabtop仅在支持 SLAB/SLUB 分配器并挂载了 proc 文件系统的 Linux 环境中可用,不同内核版本下缓存名称和字段可能略有差异,请以当前系统实际输出为准。
- 文档
- 教程
【免费下载链接】linux-command
Linux命令大全搜索工具,内容包含Linux命令手册、详解、学习、搜集。https://git.io/linux
相关推荐
Telegraf slab 输入插件详解:解析 /proc/slabinfo 监控内核 Slab 缓存内存占用
Telegraf slab 输入插件详解:解析 /proc/slabinfo 监控内核 Slab 缓存内存占用 Telegraf 的 slab 输入插件专为 L
可观测性指标监控运维Linux 内核模块信息查询实战:linux-command 仓库 modinfo 命令详解
Linux 内核模块信息查询实战:linux command 仓库 modinfo 命令详解 本文以 linux command 仓库中 modinfo 命令文
文档教程linux-command 项目详解:kernelversion 命令获取 Linux 内核主版本号的实战指南
linux command 项目详解:kernelversion 命令获取 Linux 内核主版本号的实战指南 kernelversion 是 Debian/U
文档教程
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考