perf获取 Linux 内存信息主要有两个专用子命令,它们侧重点不同:perf kmem用于分析内核内存分配,perf mem用于分析 CPU 内存访问。
perf kmem:分析内核内存分配
这个工具直接跟踪内核的kmalloc、kfree等事件,非常适合排查内存泄漏和碎片问题。
基本用法:
# 记录内核内存分配事件 sudo perf kmem record -a sleep 30 # 查看统计结果 sudo perf kmem stat --caller --sort=frag,hit,bytes
核心选项:
--caller:显示每个调用点的统计信息,这是定位问题源头的关键。--sort:支持按frag(碎片率)、hit(命中次数)、bytes(分配字节)等排序。例如--sort=frag,hit,bytes会优先展示碎片率最高的调用点。--slab/--page:分别分析 Slab 分配器和页分配器的事件,默认是 Slab。--live:仅用于--page模式,显示当前存活的页分配统计,而不是累计总量,对排查持续泄漏更直观。
perf mem:分析 CPU 内存访问
这个工具通过硬件性能计数器(如 Intel 的 PEBS)采样内存的加载(load)和存储(store)操作,用于分析内存访问延迟、缓存命中率、TLB 行为等。
基本用法:
# 采样内存访问(默认同时采集 load 和 store) sudo perf mem record -a sleep 10 # 报告结果 sudo perf mem report
核心选项:
-t load或-t store:只采样指定类型的操作。--ldlat <n>:设置加载延迟阈值,仅采样延迟超过该值的操作(Intel/ARM64 支持)。-e:指定事件,可用perf mem record -e list查看可用事件。报告时可用
--sort=mem按内存访问类型(如 L1、L3、Local RAM)排序,快速定位缓存未命中或内存延迟热点。
如何选择
排查内核内存泄漏/碎片→ 使用
perf kmem,通过--caller和--sort=frag定位异常调用点。分析用户程序内存访问性能→ 使用
perf mem,采样内存操作,定位延迟热点或缓存未命中。