如何在 Linux 性能分析中使用 perf 工具?

文章导读
perf 是 Linux 内核自带的性能分析工具,适合在需要定位 CPU 消耗、函数调用热点或硬件事件异常时进行底层采样分析。
📋 目录
  1. 环境准备与安装
  2. 核心命令速用
  3. 分步处理流程
  4. perf report 输出解读
  5. 怎么验证是否生效
  6. 常见坑与排查
A A

perf 是 Linux 内核自带的性能分析工具,适合在需要定位 CPU 消耗、函数调用热点或硬件事件异常时进行底层采样分析。

先说结论:perf 适合生产环境低风险采样,但需要 root 权限且要注意对业务的微小干扰。

  • 先定位:用 perf top 确认 CPU 热点函数
  • 先做:用 perf record 抓取调用栈数据(配合 timeout 控制时长)
  • 再验证:对比优化前后的 cycles 和指令数

环境准备与安装

大多数发行版需要安装 linux-tools 包,且版本需与内核匹配。Ubuntu 下运行:

sudo apt install linux-tools-common linux-tools-generic linux-tools-$(uname -r)

若需要解析动态库符号,建议安装调试符号包,例如 libc6-dbg。perf 通常需要 root 权限或 CAP_SYS_ADMIN 能力,普通用户运行可能会报错权限不足。

核心命令速用

以下是几个最高频的命令,直接复制即可使用:

实时查看热点函数:perf top

录制数据并生成报告:perf record -g -p <pid> 然后 perf report

查看性能计数器统计:perf stat -p <pid>

生产环境低开销采样(限制频率 99Hz):perf record -F 99 -p <pid>

分步处理流程

1. 定位热点:运行 perf top 观察实时占用最高的函数。

如何在 Linux 性能分析中使用 perf 工具?

2. 采集数据:使用 timeout 10 perf record -g -p <进程 ID> 采集 10 秒数据,-g 表示记录调用图。避免使用不存在的 `--sleep-time` 参数。

3. 分析报告:运行 perf report 查看交互式界面,或使用 perf script 导出文本。

perf report 输出解读

运行 perf report `--stdio` 可查看文本格式,典型输出如下:

# Samples: 10K of event 'cpu_core'
# Event count (samples): 10000
#
# Overhead  Command  Shared Object      Symbol
# ........  .......  .................  ......................
#
    45.23%  myapp    myapp              [.] process_request
    12.05%  myapp    [kernel.kallsyms]  [k] __mutex_lock
     5.10%  myapp    libc.so.6          [.] malloc

关键指标:

  • Overhead:该函数占用的 CPU 时间百分比,越高越需要优化。
  • Command:产生性能的进程名。
  • Symbol:具体函数名,若显示十六进制地址则说明缺失调试符号。

怎么验证是否生效

优化代码或配置后,再次运行 perf stat -p <pid>,观察 task-clock、cycles 和 instructions 数值是否下降。如果热点函数在 perf report 中的占比降低,说明优化有效。性能提升幅度取决于瓶颈类型,通常热点函数占比下降即代表优化有效。

常见坑与排查

1. 权限问题:容器内运行 perf 可能受限于 capabilities,需要宿主机的支持,或调整 /proc/sys/kernel/perf_event_paranoid 配置。

2. 开销控制:高频采样会增加 CPU 负载,生产环境建议控制采样频率,使用 -F 99 限制为 99Hz 以降低干扰。

3. 符号表缺失:如果看到十六进制地址而不是函数名,需要确保调试符号已安装。例如 Ubuntu 下安装 libc6-dbg 或对应包的 debuginfo 版本。