perf kmem的完整用法围绕两个子命令展开:record(采集数据)和stat(分析数据)。所有选项都需要根据你分析的对象(Slab 或 Page)来配合使用。
基本语法
perf kmem [<options>] {record|stat}核心子命令
1.perf kmem record:采集内存分配事件
用于录制内核内存分配/释放的事件流,生成perf.data文件供后续分析。
# 基本用法:记录命令执行期间的内存事件 sudo perf kmem record -- <command> # 指定输出文件(注意:-o 必须放在 record 之后)[citation:11] sudo perf kmem record -o /tmp/kmem.data sleep 30
注意:record支持传递额外的perf record选项(如-o、-a等),但这些选项必须紧跟在record之后。
2.perf kmem stat:分析统计结果
读取perf.data,输出内存分配统计报告。
# 基本用法:读取默认的 perf.data sudo perf kmem stat # 指定输入文件 sudo perf kmem stat -i /tmp/kmem.data
统计模式与排序选项
分析对象(二选一)
| 选项 | 说明 | 默认 |
|---|---|---|
--slab | 分析 Slab 分配器(小对象) | ✅(无指定时) |
--page | 分析 Page 分配器(大块内存) |
统计维度
| 选项 | 说明 |
|---|---|
--caller | 按调用点(Callsite)聚合统计,定位泄漏源头的关键 |
--alloc | 按单次分配(Per-allocation)展示详情 |
-v, --verbose | 显示更多信息(如符号地址) |
排序选项-s, --sort
必须配合
--slab/--page/--alloc/--caller使用。
| 适用模式 | 可用排序键 |
|---|---|
| Slab | ptr、callsite、bytes、hit、pingpong、frag |
| Page | page、callsite、bytes、hit、order、migtype、gfp |
# 示例:按碎片率降序排列 Slab 调用点 sudo perf kmem stat --slab --caller --sort=frag,hit
其他实用选项
| 选项 | 说明 |
|---|---|
-l <num>, --line=<num> | 仅显示前 N 行结果 |
--raw-ip | 显示原始 IP 地址,而非解析后的符号 |
--time=<start>,<stop> | 仅分析指定时间窗口内的样本(格式:秒.微秒) |
--live | (仅--page)仅显示当前存活的页分配统计,而非累计总量,对排查持续泄漏更直观 |
-f, --force | 强制读取perf.data,忽略文件所有权校验 |
-i <file>, --input=<file> | 指定stat要读取的输入文件 |
典型用法示例
# 排查 Slab 泄漏:采集 30 秒系统内存事件,按调用点查看碎片率 sudo perf kmem record -a sleep 30 sudo perf kmem stat --slab --caller --sort=frag,hit # 排查 Page 外部碎片:采集后查看 Page 分配统计 sudo perf kmem record --page sleep 30 sudo perf kmem stat --page --caller # 查看当前存活的页分配(排查持续泄漏) sudo perf kmem stat --page --live