Linux命令-slabtop(实时显示内核 slab 缓存信息)

发布时间:2026/8/2 18:23:41
Linux命令-slabtop(实时显示内核 slab 缓存信息) Linux命令-slabtop实时显示内核 slab 缓存信息 简介 语法⚙️ 选项 实战示例示例 1基本 slabtop示例 2按对象数排序示例 3一次性输出 监控示例 4诊断内核内存泄漏示例 5常见 cache 名称识别示例 6与用户态内存工具对比示例 7性能调优场景示例 8自动化分析与脚本⚠️ 注意事项 总结 相关命令快速参考slabtop是实时显示 Linux 内核 slab 分配器缓存使用情况的工具类似top但专门针对内核态内存slab / slub / slob 三种分配器之一。它显示各种内核对象的缓存命中率、对象数、占用内存是诊断内核内存泄漏、内存碎片、驱动 bug的核心工具。用户态top看进程内存slabtop看内核内存。 简介项目说明命令全称slab top所属包procps-ng数据源/proc/slabinfo工作模式实时刷新默认 3 秒或一次性输出用途诊断内核态内存问题权限需要 root部分内核版本普通用户可见但不全现代替代slabtop命令本身cat /proc/slabinfo原始数据perf / bpftool高级诊断slab / slub / slob 三种分配器分配器特点用途slab原始实现复杂早期内核slub简化版Linux 默认大多数发行版slob极简版Simple List of Blocks嵌入式、小内存slab 是什么Linux 内核的小对象内存分配器替代频繁的kmalloc/kfree预先为常见对象task_struct、inode、dentry、buffer_head等建立对象池cache申请对象时从 cache 取避免反复创建/销毁解决内存碎片问题 语法slabtop[选项]⚙️ 选项选项简写说明--delayN-d N刷新间隔秒默认 3--sortSORT-s SORT排序字段见下表--once-o一次性输出不刷新--version-V版本--help-?帮助排序字段-s 可选字段含义aACTIVE 对象数b对象数/页OBJ/SLABc缓存大小CACHE SIZEl命中次数HITSn名称NAMEo活跃对象数 × 对象大小活跃内存p每页对象数 / 每 slabs对象大小OBJ SIZEu缓存使用率 实战示例示例 1基本 slabtop# 实时刷新默认 3 秒$sudoslabtop Active / Total Objects(% used):678901/1234567(55.0%)Active / Total Slabs(% used):23456/34567(67.9%)Active / Total Caches(% used):98/142(69.0%)Total / Used Memory:256789/145678OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME456783456775%0.50K12343749360K task_struct123451098789%0.13K4123016480K dentry123451000081%0.06K2006216000K kmalloc-649876789080%1.00K2465439440K inode8765700079%0.25K5671522680K kmalloc-256...字段详解字段含义OBJS该 cache 中总对象数ACTIVE正在使用的对象数USE使用率ACTIVE/OBJS %OBJ SIZE单对象大小SLABS分配的 slab 页数OBJ/SLAB每个 slab 含多少对象CACHE SIZE该 cache 占用的总内存NAMEcache 名task_struct等头部统计行含义Active / Total Objects活跃对象 / 总对象Active / Total Slabs活跃 slab / 总 slabActive / Total Caches活跃 cache / 总 cacheTotal / Used Memory内存总量 / 使用量示例 2按对象数排序# 按 OBJS 排序看哪个 cache 对象最多$sudoslabtop-sa# 按 CACHE SIZE 排序看哪个 cache 占内存最多$sudoslabtop-sc# 按 NAME 排序$sudoslabtop-sn# 按对象大小排序$sudoslabtop-ss# 实战找出最大 cache$sudoslabtop-sc-o|head-20Active / Total Objects(% used):678901/1234567(55.0%)... OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME102400080000078%0.50K32768324096000K dentry50000040000080%1.00K12500402000000K inode20000015000075%0.25K20001001600000K kmalloc-256...# 重点关注CACHE SIZE 大的 占用内存多示例 3一次性输出 监控# 一次性输出不刷新$sudoslabtop-o# 适合脚本处理# 监控 5 秒输出$sudoslabtop-d1-o# 每秒刷新一次# 录制到文件做趋势分析$sudoslabtop-d5-o/var/log/slab.log# 持续 5 秒间隔输出# 配合 grep$sudoslabtop-o|grep-Edentry|inode|task_structOBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME456783456775%0.50K12343749360K task_struct123451098789%0.13K4123016480K dentry9876789080%1.00K2465439440K inode示例 4诊断内核内存泄漏# 场景系统内存持续增长怀疑内核泄漏# 1. 第一次记录$sudoslabtop-o/tmp/slab_1.txt $date2024-01-1514:30:00# 2. 等待 5 分钟$sleep300# 3. 第二次记录$sudoslabtop-o/tmp/slab_2.txt $date2024-01-1514:35:00# 4. 对比$diff/tmp/slab_1.txt /tmp/slab_2.txt# 找出增长最快的 cache# 例如dentry 数量持续增长 文件系统相关驱动有问题# 例如nf_conntrack 持续增长 防火墙连接表泄漏# 例如vm_area_struct 持续增长 进程内存映射泄漏# 5. 实战自动化监控$cat/opt/scripts/slab_monitor.sh#!/bin/bashLOG/var/log/slab_growth.logTHRESHOLD10000# 5 分钟增长阈值prev_count0prev_namewhiletrue;do# 取 cache 中最大 5 个output$(slabtop-o|head-7|tail-5)# 提取最大 cachemax$(echo$output|tail-1)name$(echo$max|awk{print $NF})objs$(echo$max|awk{print $1})# 检测增长if[$name$prev_name][$((objs-prev_count))-gt$THRESHOLD];thenecho[$(date)] 警告:$name增长$((objs-prev_count))个对象$LOGlogger-pkern.warningSlab cache$namegrowing:$objsfiprev_name$nameprev_count$objssleep300done示例 5常见 cache 名称识别# 1. 进程相关 $sudoslabtop-o|grep-Etask_struct|signal|files_struct# task_struct: 进程描述符每个进程 1 个# signal_struct: 信号结构# files_struct: 进程打开的文件# 2. 文件系统相关 $sudoslabtop-o|grep-Edentry|inode|buffer_head# dentry: 目录项**最常见大对象**# inode: 文件元数据# buffer_head: 文件页缓存# 3. 网络相关 $sudoslabtop-o|grep-Esk_buff|sock|nf_conn# sk_buff: 网络数据包**网络性能关键**# sock: 套接字# nf_conn: netfilter 连接追踪# 4. 内存管理 $sudoslabtop-o|grep-Evm_area|page|mm_struct# vm_area_struct: 进程的虚拟内存区# page: 内核页帧描述符# 5. 驱动相关 $sudoslabtop-o|grep-Escsi|usb|kvm# 各类驱动对象# 实战dentry 增长 目录项泄漏 $sudoslabtop-sc-o|head-10OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME102400080000078%0.13K32768324096K dentry# 如果持续增长# 1. 检查是否有进程持续打开/关闭目录# 2. 检查 NFS / FUSE 挂载# 3. 同步检查 /proc/sys/fs/dentry-state$cat/proc/sys/fs/dentry-state13456710987645000# nr_dentry / nr_unused / age_limit / ...# 手动清理$echo2/proc/sys/vm/drop_caches# 释放 dentry inode cache示例 6与用户态内存工具对比# 1. 用户态 vs 内核态 # 用户态top / ps$top# 字段VIRT虚拟/ RES实际/ SHR共享# 这些是**进程**的用户态内存# 内核态slabtop$sudoslabtop# 字段OBJS / SLABS / CACHE SIZE# 这些是**内核对象**的内存# 2. 完整内存视图 # 总览$free-htotal usedfreeshared buff/cache available Mem:7.7G1.2G4.0G 100M2.5G6.0G# total 物理 RAM# used 已用用户 内核 缓存# buff/cache 内核页缓存**会自动回收**# available **真正可用**含可回收缓存# 内核 slab 占多少$sudoslabtop-o|head-1Active / Total Objects(% used):678901/1234567(55.0%)Total / Used Memory:256789/145678# Used Memory 内核 slab 占用的内存# 用户态 内核态 完整内存占用# 3. /proc/meminfo 详细信息 $grep-ESlab|SReclaimable|SUnreclaim/proc/meminfo Slab:145678kB SReclaimable:87654kB ← 可回收的 slab SUnreclaim:58024kB ← 不可回收的 slab# SReclaimable SUnreclaim Slab# 4. 完整内存全景图 $cat/proc/meminfo|head-30MemTotal:8057892kB MemFree:4123456kB MemAvailable:6234567kB Buffers:123456kB Cached:2098765kB SwapCached:0kB Active:1234567kB Inactive:1876543kB Active(anon):456789kB Inactive(anon):123456kB Active(file):777778kB Inactive(file):1753087kB Unevictable:0kB Mlocked:0kB SwapTotal:2097148kB SwapFree:2097148kB Dirty:123kB Writeback:0kB AnonPages:580245kB Mapped:234567kB Shmem:123456kB KReclaimable:87654kB Slab:145678kB SReclaimable:87654kB SUnreclaim:58024kB KernelStack:5678kB PageTables:12345kB...示例 7性能调优场景# 场景 1网络服务器 sk_buff 增长 # 表现网卡丢包、网络延迟# 检查$sudoslabtop-o|grep-Esk_buffOBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME20000018000090%0.25K625032200000K skbuff_head_cache# 90% 使用率 接近上限可能在网络高负载时丢包# 解决# 1. 调整 netdev_max_backlog$sudosysctl-wnet.core.netdev_max_backlog2000# 2. 调整 socket 缓冲区$sudosysctl-wnet.core.rmem_max12582912$sudosysctl-wnet.core.wmem_max12582912# 场景 2dentry 缓存不足 # 表现磁盘 IO 高、stat() 慢# 解决调大 /proc/sys/vm/vfs_cache_pressure$cat/proc/sys/vm/vfs_cache_pressure100# 调小保留更多 dentry$sudosysctl-wvm.vfs_cache_pressure50# 场景 3进程泄漏 task_struct # 表现进程数持续增长$ps-e|wc-l# 对应 slabtop 中 task_struct 增长# 解决定位并 kill 泄漏进程$psaux--sort-%mem|head-20# 找出大内存进程# 场景 4nf_conntrack 满 $sudoslabtop-o|grepnf_conn OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME262144262144100%0.31K8192321048576K nf_conntrack# 100% 使用 防火墙连接表已满新连接被拒绝# 解决$sudosysctlnet.netfilter.nf_conntrack_max524288$sudosysctlnet.netfilter.nf_conntrack_tcp_timeout_established600# 调大连接上限 缩短超时示例 8自动化分析与脚本# 1. slab 持续监控脚本 $cat/opt/scripts/slab_watch.sh#!/bin/bash# 每 60 秒记录一次 slabtop 输出LOG_DIR/var/log/slabmkdir-p$LOG_DIRwhiletrue;doTS$(date%F_%H%M%S)slabtop-o$LOG_DIR/slab_$TS.txt# 清理 7 天前find$LOG_DIR-nameslab_*.txt-mtime7-deletesleep60done# 2. 大 cache 告警 $cat/opt/scripts/slab_alert.sh#!/bin/bash# 监控 cache 1GBTHRESHOLD_KB1048576# 1GBslabtop-o|tail-n7|awk-vthresh$THRESHOLD_KB { cache_kb $7 gsub(K, , cache_kb) if (cache_kb thresh) { print [ALERT] $8 cache 使用 cache_kb K 内存 } }|whilereadline;dologger-pkern.warningSlab:$lineecho$line# 可加钉钉/邮件通知done# 3. 与其他监控集成 $cat/opt/scripts/slab_to_prometheus.sh#!/bin/bash# 转换 slabtop 为 prometheus 文本格式OUT/var/lib/node_exporter/textfile/slab.promecho# HELP slab_cache_bytes Total bytes used by kernel slab cache$OUTecho# TYPE slab_cache_bytes gauge$OUTslabtop-o|tail-n7|awk { cache_kb $7 gsub(K, , cache_kb) gsub(M, 000, cache_kb) cache_bytes cache_kb * 1024 name $8 gsub(-, _, name) print slab_cache_bytes{name\ name \} cache_bytes }$OUT# prometheus node_exporter 采集# 配合 grafana 画图⚠️ 注意事项1. 需要 root 权限普通用户执行slabtop会显示受限数据仅当 kernel.yama.ptrace_scope0 且/proc/slabinfo全员可读。生产中必须 sudo。2. /proc/slabinfo 内核选项部分内核配置CONFIG_SLAB关闭时/proc/slabinfo不存在。检查$cat/proc/slabinfo2/dev/null|head# 无输出 内核不导出内核 2.6.32 或嵌入式系统可能没。3. SLAB vs SLUB vs SLOB 输出差异SLUB现代默认字段最全SLAB老内核字段少SLOB嵌入式几乎无数据现代 Linux 都是 SLUB。4. 高频率刷新影响slabtop -d 1每秒刷新会持续读取/proc/slabinfo。大量 cache几万时读取可能10-50ms 延迟。监控系统别用 5 秒间隔。5. 排序字段大小写slabtop -s a活跃对象数和-s A某些版本含义不同。用--sort长格式更稳。6. 名称中-的转义很多 cache 名含-kmalloc-64、nf_conn。grep/awk 处理时用引号或转义。7. 与 /proc/meminfo 的关系slabtop头部 “Used Memory” /proc/meminfo中Slab字段。但只展示部分不是全部 cache。完整数据看/proc/slabinfo原始文件。8. 容器内的局限Docker 默认 PID 命名空间隔离容器内slabtop看到的是宿主机全局。也可能因 cgroup 限制看到不同视图。9. 数值单位slabtop默认千字节K。OBJ SIZE是单对象大小带K。实际 K 1024 字节不是 1000。10. 优化建议如果某个 cache 持续 100% 满且不能回收检查驱动 bug升级内核调整/proc/sys/vm/*参数重启服务/系统最后手段启用slab_nomerge避免误合并使用 BPF 工具做精细分析 总结slabtop是内核内存的 top——专门看 slab 分配器。本节要点核心定位用户态内存用top/ps内核态内存用slabtop关键字段OBJS/ACTIVE/USE/OBJ SIZE/SLABS/CACHE SIZE/NAME诊断场景内核内存增长 → 观察哪个 cache 在涨dentry 增长 → 目录项泄漏/缓存压力sk_buff 满 → 网络高负载nf_conntrack 满 → 防火墙拒绝连接数据源/proc/slabinfoslabtop是美化器配合使用free整体内存/proc/meminfoslab 详细vmstatslab 回收ps用户态进程内存最终建议日常巡检slabtop -s c -o看最大 5 个 cache内存告警配合/proc/meminfo中 Slab 字段深度诊断用perf/bpftool抓具体内核对象生产监控导出 prometheus 指标。 相关命令命令用途slabtop实时 slab 信息本节top/htop用户态进程资源free物理内存概览cat /proc/slabinfoslab 原始数据cat /proc/meminfo详细内存信息vmstat虚拟内存统计ps aux进程详情pmap进程内存映射sysctl调整内核参数echo N /proc/sys/vm/drop_caches手动回收缓存perf性能分析bpftoolBPF 工具高级numastatNUMA 内存统计sysstat/sar -r内存历史crash内核转储分析vmcore