☰
linux-command 项目实战:slabtop 命令详解——实时监控内核 Slab 内存缓存
2026/10/3 8:35:56 网站建设 项目流程
  • 文档
  • 教程

【免费下载链接】linux-command

Linux命令大全搜索工具,内容包含Linux命令手册、详解、学习、搜集。https://git.io/linux

项目地址:https://gitcode.com/GitHub_Trending/linux/linux-command
点击查看免费下载

本文基于开源仓库 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

项目地址:https://gitcode.com/GitHub_Trending/linux/linux-command
点击查看免费下载
上一篇:APK-Installer 常见问题:在 Windows 上直接安装 APK 的 7 个关键点
下一篇:PL2303 驱动安装终极指南:一招让老芯片在 Win10/11 下重新"开口说话"

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询