perf 命令详解
perf
是 Linux 系统中最强大的 性能分析工具,基于内核的 perf_events
子系统实现,支持硬件性能计数器(PMC)、软件事件跟踪等功能,用于定位 CPU、内存、I/O 等性能瓶颈。以下是其核心用法与实战指南:
一、安装与基础配置
-
安装
# Debian/Ubuntu
sudo apt install linux-tools-common linux-tools-$(uname -r)# CentOS/RHEL
sudo yum install perf# 验证安装
perf --version
2. 内核符号支持
- 安装调试符号包(如
linux-image-$(uname -r)-dbgsym
),以便perf
解析内核函数名。 - 临时允许非特权用户使用性能监控(可选):
sudo sysctl kernel.perf_event_paranoid=-1
二、核心功能与子命令
子命令 | 功能描述 |
---|---|
perf stat | 统计程序运行的硬件事件(如缓存命中率) |
perf record | 记录性能数据(生成 .data 文件) |
perf report | 分析 record 生成的数据 |
perf top | 实时监控系统或进程的性能热点 |
perf trace | 跟踪系统调用(类似 strace ) |
perf probe | 动态添加内核或用户空间探针 |
三、常用场景与实战示例
1. 统计程序性能事件
# 统计命令执行期间的 CPU 周期、缓存命中等
perf stat -e cycles,cache-misses,branch-misses ./my_program
输出示例:
Performance counter stats for './my_program':2,356,789 cycles # 3.801 GHz45,678 cache-misses # 2.123 % of all cache refs12,345 branch-misses # 0.56% of all branches0.001234567 seconds time elapsed
2. 采样 CPU 热点函数
# 记录进程的 CPU 使用(采样频率 99Hz)
perf record -F 99 -g -- ./my_program # -g 记录调用栈
perf report --stdio # 文本报告
perf report --gui=gtk # 图形化分析(需安装 gtk 支持)
输出解读:
- Overhead:函数占用的 CPU 时间比例。
- Command:进程名。
- Shared Object:所属动态库或可执行文件。
3. 生成火焰图(Flame Graph)
# 1. 记录性能数据
perf record -F 99 -g -- ./my_program
# 2. 生成折叠堆栈
perf script > out.perf
stackcollapse-perf.pl out.perf > out.folded
# 3. 生成火焰图
flamegraph.pl out.folded > flamegraph.svg
火焰图直观展示函数调用栈的 CPU 占用分布,横向宽度表示耗时比例。
4. 跟踪系统调用
# 类似 strace,但性能更高(记录所有线程)
perf trace -e 'syscalls:sys_enter_*' ./my_program
过滤特定系统调用:
perf trace -e 'syscalls:sys_enter_open,syscalls:sys_enter_read'
5. 动态添加探针
# 在内核函数 add_to_page_cache_lru 添加探针
perf probe --add add_to_page_cache_lru
# 跟踪探针事件
perf record -e probe:add_to_page_cache_lru -a
四、高级功能
-
硬件性能计数器
使用perf list
查看支持的事件(如instructions
、branch-misses
):
perf stat -e instructions,L1-dcache-load-misses ./my_program
2. 用户空间静态探针
在代码中插入静态探针(需编译时支持):
#include <sys/sdt.h>
int main() {DTRACE_PROBE("myapp", "operation_start"); // 探针点// ...
}
跟踪探针:
perf buildid-cache --add ./my_program # 注册程序
perf probe --exec=./my_program --add 'myapp:operation_start'
perf record -e 'probe_myapp:*' ./my_program
五、注意事项
- 权限要求
- 部分功能(如硬件计数器)需要
root
权限或CAP_PERFMON
能力。
- 部分功能(如硬件计数器)需要
- 性能开销
perf record
高频采样可能导致目标程序变慢,生产环境慎用。
- 符号解析
- 若函数名显示为十六进制地址,需安装调试符号(如
-dbgsym
包)。
- 若函数名显示为十六进制地址,需安装调试符号(如
六、与其他工具对比
工具 | 特点 | 适用场景 |
---|---|---|
perf | 内核级支持,硬件级性能分析 | CPU/内存瓶颈、调用链分析 |
strace | 系统调用跟踪 | 文件/网络操作调试 |
gdb | 源码级调试 | 程序崩溃、逻辑错误 |
掌握 perf
可快速定位性能问题,尤其在高并发、低延迟场景中作用显著。结合火焰图和动态探针,能实现从宏观到微观的全方位分析。