linux perf工具常用方法


perf 是 Linux 系统性能分析的强大工具,基于内核的 perf_events 子系统,可用于监控 CPU 性能、硬件/软件事件、函数调用等。以下是 perf 的常用方法和示例:


1. 基本命令格式

perf [options] <command>  # 对某个命令进行性能分析
perf [options] -- <command> [args]  # 分析带参数的命令
perf [options] stat/record/report/top...  # 直接使用子命令

2. 常用子命令及示例

(1) perf stat:统计事件

统计程序运行期间的硬件/软件事件(如 CPU 周期、缓存命中率等)。

# 统计命令执行的通用事件(CPU 周期、指令数等)
perf stat ls

# 统计特定事件(如缓存命中率)
perf stat -e cache-misses,cache-references ls

# 持续监控系统全局事件(按 Ctrl+C 停止)
perf stat -a sleep 5

(2) perf record + perf report:采样分析

  • record:记录采样数据到文件(默认 perf.data)。
  • report:分析采样结果。
# 记录某个命令的性能数据(-g 记录调用栈)
perf record -g ./my_program

# 记录整个系统的 CPU 使用(采样 10 秒)
perf record -a -g sleep 10

# 生成报告(交互式界面)
perf report
perf report --stdio  # 文本格式输出

(3) perf top:实时监控

类似 top,实时显示系统或进程的热点函数。

perf top                  # 监控所有 CPU
perf top -p <PID>         # 监控特定进程
perf top -e cache-misses  # 监控特定事件

(4) perf list:查看支持的事件

列出所有可监控的硬件/软件事件。

perf list                  # 列出所有事件
perf list | grep cache     # 过滤缓存相关事件

(5) perf trace:系统调用追踪

类似 strace,追踪系统调用和信号。

perf trace ls              # 追踪命令的系统调用
perf trace -p <PID>        # 追踪正在运行的进程

(6) perf annotate:代码级分析

反汇编并注释热点代码(需调试符号)。

perf annotate -s <function_name>

(7) perf script:导出原始数据

perf record 的数据转换为可读文本或脚本格式。

perf script           # 输出原始事件流
perf script -F time,event,trace  # 自定义字段

3. 常用选项

选项 说明
-a 监控所有 CPU(系统级)
-p <PID> 监控特定进程
-e <event> 指定监控的事件(如 cycles, instructions
-g 记录调用栈(用于生成火焰图)
-o <file> 输出到文件(如 perf record -o data.file
--call-graph dwarf 更准确的调用栈记录(需调试信息)

4. 高级用法

(1) 生成火焰图

  1. 采样数据:
    perf record -a -g sleep 10
    
  2. 生成折叠堆栈:
    perf script | stackcollapse-perf.pl > out.folded
    
  3. 生成 SVG 火焰图:
    flamegraph.pl out.folded > flamegraph.svg
    

    需安装 FlameGraph 工具。

(2) 监控内核事件

# 监控缺页异常
perf stat -e page-faults ls

(3) 多事件统计

perf stat -e cycles,instructions,cache-misses ./my_program

5. 常见问题

  • 权限问题:部分事件需要 sudo 或调整 /proc/sys/kernel/perf_event_paranoid
  • 调试符号:若函数名显示为十六进制地址,需安装调试符号包(如 linux-image-$(uname -r)-dbgsym)。
  • CPU 频率影响:使用 perf stat --no-scale 避免频率缩放干扰。

通过组合这些命令,可以快速定位 CPU 瓶颈、内存问题或系统调用延迟等性能问题。

posted @ 2025-05-09 17:57  morty-root  阅读(942)  评论(0)    收藏  举报