Linux性能分析:perf工具使用

529 阅读6分钟

Perf 是一个 Linux 性能分析工具。它可以帮助我们找出程序的性能瓶颈,提高代码运行效率。Perf 的全称是 Performance Counters for Linux (PCL)。它是 Linux 内核中一种用于性能分析的子系统,通过统计硬件和软件事件,帮助我们了解程序的运行情况。

image.png

一、Perf 的用法

Perf 提供了许多子命令来完成不同的性能分析任务,常用的子命令如下:

  1. perf stat:统计程序运行时的硬件事件,如缓存未命中、分支预测错误等。

  2. perf record:记录程序运行时的性能事件,用于后续的性能分析。

  3. perf report:分析记录的性能事件,生成报告。

  4. perf list:列出所有可用的性能事件。

  5. perf top:实时显示系统中占用 CPU 最多的函数。

  6. perf annotate:对特定函数进行详细的性能分析。

二、Perf 的原理

Perf 是基于硬件性能计数器(Hardware Performance Counters,HPC)的性能分析工具。硬件性能计数器是 CPU 内部的一种特殊寄存器,用于记录特定事件的发生次数。通过读取这些计数器的值,我们可以了解程序的运行情况,如缓存未命中次数、分支预测错误次数等。Perf 通过与 Linux 内核的 perf_event 子系统交互,获取这些硬件性能计数器的值。

三、Perf 的使用示例

1. 使用 perf stat 统计程序运行时的硬件事件:

$ perf stat ./your_program

2. 使用 perf record 记录程序运行时的性能事件:

$ perf record -g ./your_program

3. 使用 perf report 分析记录的性能事件:

$ perf report

4. 使用 perf top 实时显示系统中占用 CPU 最多的函数:

$ perf top

5. 使用 perf annotate 对特定函数进行详细的性能分析:

$ perf annotate function_name

四、注意事项

  1. 使用 Perf 时,需要确保 Linux 内核支持 perf_event 子系统。在编译内核时,需要开启 CONFIG_PERF_EVENTS 选项。

  2. Perf 可能需要 root 权限才能完全使用。如果在使用过程中遇到权限不足的问题,可以尝试使用 sudo 运行 Perf。

  3. Perf 的结果可能受到 CPU 频率调整、超线程等因素的影响。在进行性能分析时,需要注意这些因素,以免得出错误的结论。

五、Perf 子命令详解

1. perf stat

perf stat 用于统计程序运行时的硬件事件。它可以帮助我们了解程序的运行状况,如 CPU 使用率、缓存未命中次数等。常用选项:

  • -e:指定要统计的事件。默认情况下,perf stat 会统计一些常见的硬件事件,如 CPU 使用率、缓存未命中次数等。通过 -e 选项,我们可以指定要统计的事件。例如,perf stat -e cache-misses ./your_program 会统计程序运行时的缓存未命中次数。

  • -r:指定运行次数。通过 -r 选项,我们可以指定要运行的次数。perf stat 会计算每次运行的事件统计值,并给出平均值。例如,perf stat -r 5 ./your_program 会运行程序 5 次,并给出平均的硬件事件统计值。

2. perf record

perf record 用于记录程序运行时的性能事件。它会将记录的性能事件保存到文件(默认为 perf.data),以便后续分析。常用选项:

  • -g:记录调用栈信息。这对于分析程序的调用关系非常有用。例如,perf record -g ./your_program 会记录程序运行时的性能事件以及调用栈信息。

  • -F:指定采样频率。通过 -F 选项,我们可以指定 perf record 的采样频率。较高的采样频率可以提供更详细的性能信息,但会增加记录文件的大小。例如,perf record -F 1000 ./your_program 会以每秒 1000 次的频率记录性能事件。

  • -o:指定记录文件。通过 -o 选项,我们可以指定 perf record 保存记录文件的路径。例如,perf record -o output.data ./your_program 会将记录的性能事件保存到 output.data 文件。

3. perf report

perf report 用于分析 perf record 保存的性能事件。它会生成一个报告,展示程序中各个函数的性能消耗。常用选项:

  • -i:指定输入文件。通过 -i 选项,我们可以指定 perf report 分析的记录文件。例如,perf report -i output.data 会分析 output.data 文件中的性能事件。

  • —stdio:以文本模式显示报告。默认情况下,perf report 会以交互式界面显示报告。通过 —stdio 选项,我们可以让 perf report 以文本模式显示报告。例如,perf report --stdio 会以文本模式显示性能报告。

4. perf top

perf top 用于实时显示系统中占用 CPU 最多的函数。它类似于 top 命令,但展示的是函数级别的性能信息。常用选项:

  • -F:指定采样频率。通过 -F 选项,我们可以指定 perf top 的采样频率。较高的采样频率可以提供更实时的性能信息,但会增加系统负担。例如,perf top -F 1000 会以每秒 1000 次的频率采样性能事件。

5. perf annotate

perf annotate 用于对特定函数进行详细的性能分析。它会展示函数的汇编代码以及每条指令的性能消耗。常用选项:

  • -i:指定输入文件。通过 -i 选项,我们可以指定 perf annotate 分析的记录文件。例如,perf annotate -i output.data function_name 会分析 output.data 文件中的性能事件,并针对 function_name 函数进行详细分析。

  • —stdio:以文本模式显示报告。默认情况下,perf annotate 会以交互式界面显示报告。通过 —stdio 选项,我们可以让 perf annotate 以文本模式显示报告。例如,perf annotate --stdio function_name 会以文本模式显示 function_name 函数的详细性能分析报告。

六、Perf 使用技巧

  1. 编译时优化:为了获得更准确的性能分析结果,建议在编译程序时开启优化选项。例如,使用 GCC 编译器时,可以通过 -O2 或 -O3 选项开启优化。

  2. 使用 debug 信息:为了让 Perf 能够正确解析程序的符号信息,建议在编译程序时保留 debug 信息。例如,使用 GCC 编译器时,可以通过 -g 选项保留 debug 信息。

  3. 排除外部干扰:在进行性能分析时,尽量减少其他程序对系统资源的占用,以免影响 Perf 的结果。例如,可以关闭不必要的后台程序,或者在空闲时段进行性能分析。

  4. 分析多线程程序:Perf 支持对多线程程序的性能分析。使用 perf record 时,可以通过 -t 选项指定要分析的线程。例如,perf record -t thread_id ./your_program 会分析指定线程的性能事件。

  5. 分析内核函数:Perf 支持对内核函数的性能分析。使用 perf record 时,可以通过 -k 选项指定要分析的内核函数。例如,perf record -k ./your_program 会分析内核函数的性能事件。

  6. 分析远程系统:Perf 支持对远程系统的性能分析。可以通过 ssh 将 perf 命令发送到远程系统,然后将记录文件传回本地进行分析。例如,ssh user@remote_host "perf record -o output.data ./your_program" 会在远程系统上运行 perf,并将记录文件传回本地。

附录

本文使用 文章同步助手 同步