Perf 是一个 Linux 性能分析工具。它可以帮助我们找出程序的性能瓶颈,提高代码运行效率。Perf 的全称是 Performance Counters for Linux (PCL)。它是 Linux 内核中一种用于性能分析的子系统,通过统计硬件和软件事件,帮助我们了解程序的运行情况。
一、Perf 的用法
Perf 提供了许多子命令来完成不同的性能分析任务,常用的子命令如下:
-
perf stat:统计程序运行时的硬件事件,如缓存未命中、分支预测错误等。
-
perf record:记录程序运行时的性能事件,用于后续的性能分析。
-
perf report:分析记录的性能事件,生成报告。
-
perf list:列出所有可用的性能事件。
-
perf top:实时显示系统中占用 CPU 最多的函数。
-
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
四、注意事项
-
使用 Perf 时,需要确保 Linux 内核支持 perf_event 子系统。在编译内核时,需要开启 CONFIG_PERF_EVENTS 选项。
-
Perf 可能需要 root 权限才能完全使用。如果在使用过程中遇到权限不足的问题,可以尝试使用 sudo 运行 Perf。
-
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 使用技巧
-
编译时优化:为了获得更准确的性能分析结果,建议在编译程序时开启优化选项。例如,使用 GCC 编译器时,可以通过 -O2 或 -O3 选项开启优化。
-
使用 debug 信息:为了让 Perf 能够正确解析程序的符号信息,建议在编译程序时保留 debug 信息。例如,使用 GCC 编译器时,可以通过 -g 选项保留 debug 信息。
-
排除外部干扰:在进行性能分析时,尽量减少其他程序对系统资源的占用,以免影响 Perf 的结果。例如,可以关闭不必要的后台程序,或者在空闲时段进行性能分析。
-
分析多线程程序:Perf 支持对多线程程序的性能分析。使用 perf record 时,可以通过 -t 选项指定要分析的线程。例如,
perf record -t thread_id ./your_program
会分析指定线程的性能事件。 -
分析内核函数:Perf 支持对内核函数的性能分析。使用 perf record 时,可以通过 -k 选项指定要分析的内核函数。例如,
perf record -k ./your_program
会分析内核函数的性能事件。 -
分析远程系统:Perf 支持对远程系统的性能分析。可以通过 ssh 将 perf 命令发送到远程系统,然后将记录文件传回本地进行分析。例如,
ssh user@remote_host "perf record -o output.data ./your_program"
会在远程系统上运行 perf,并将记录文件传回本地。
附录
本文使用 文章同步助手 同步