6 使用 Perf 进行基于硬件的性能监视 #
Perf 是一个用于访问处理器性能监视单元 (PMU) 以及记录和显示软件事件(例如页错误)的界面。它支持系统范围的监视、按线程的监视和 KVM 虚拟化 Guest 监视。
可以在报告中存储生成的信息。例如,此报告包含有关指令指针的信息,或线程执行的代码的信息。
Perf 由两部分组成:
集成到 Linux 内核的代码,负责向硬件发出指令。
perf
用户空间实用程序,可让您使用内核代码并帮助您分析收集的数据。
6.1 基于硬件的监视 #
进行性能监视意味着需要收集有关应用程序或系统执行情况的信息。可以通过基于软件的方式或者从 CPU 或芯片组获取这些信息。Perf 集成了这两种方式。
许多新式处理器都包含性能监视单元 (PMU)。PMU 的设计和功能与特定的 CPU 相关。例如,寄存器数量、支持的计数器和功能根据 CPU 实施方式而异。
每个 PMU 模型包含一组寄存器:性能监视配置 (PMC) 和性能监视数据 (PMD)。这两个寄存器都是可读的,但只有 PMC 是可写的。这些寄存器用于存储配置信息和数据。
6.2 采样和计数 #
Perf 支持多种分析模式:
计数: 统计某个事件的发生次数。
基于事件的采样: 一种不太确切的计数方式:每当发生的事件数达到特定的阈值时,就会记录一个样本。
基于时间的采样: 一种不太确切的计数方式:按定义的频率记录样本。
基于指令的采样(仅限 AMD64): 处理器跟踪按给定时间间隔出现的指令,并对这些指令生成的事件采样。这样便可以跟踪各个指令,并查看哪些是对性能至关重要的指令。
6.3 安装 Perf #
Perf 内核代码已包含在默认内核中。要使用用户空间实用程序,请安装软件包 perf.
6.4 Perf 子命令 #
为了收集必要信息,perf
工具中包含多个子命令。本节概述了最常用的命令。
要以手册页的形式查看任一子命令的帮助,请使用 perf help
SUBCOMMAND 或 man perf-
SUBCOMMAND。
perf stat
启动一个程序,并创建该程序退出后显示的统计概述。
perf stat
用于事件计数。perf record
启动一个程序,并创建包含性能计数器信息的报告。该报告作为
perf.data
存储在当前目录中。perf record
用于事件采样。perf report
显示先前使用
perf record
创建的报告。perf annotate
显示报告文件以及已执行代码的批注版本。如果安装了调试符号,则还会显示源代码。
perf list
列出 Perf 可以使用当前内核和您的 CPU 报告的事件类型。可按类别过滤事件类型 — 例如,要仅查看硬件事件,请使用
perf list hw
。perf_event_open
的手册页提供了最重要事件的简短说明。例如,要查找branch-misses
事件的说明,请搜索BRANCH_MISSES
(请注意拼写差异):>
man
perf_event_open |grep
-A5 BRANCH_MISSES事件有时可能模糊不清。请注意,小写的硬件事件名称并非原始硬件事件的名称,而是 Perf 创建的别名的名称。这些别名对应于每个受支持处理器上名称不同但定义类似的硬件事件。
例如,在 Intel 处理器上,
cpu-cycles
事件对应于硬件事件UNHALTED_CORE_CYCLES
。而在 AMD 处理器上,则对应于硬件事件CPU_CLK_UNHALTED
。Perf 还允许测量特定于硬件的原始事件。要查找这些事件的说明,请查看 CPU 供应商的《Architecture Software Developer's Manual》(体系结构软件开发人员手册)。第 6.7 节 “更多信息”中提供了 AMD64/Intel 64 处理器的相关文档链接。
perf top
显示发生的系统活动。
perf trace
此命令的行为与
strace
类似。使用此子命令可以查看特定的线程或进程执行了哪些系统调用,以及该线程或进程收到了哪些信号。
6.5 统计特定类型的事件 #
要统计某个事件(例如 perf list
显示的事件)的发生次数,请使用:
#
perf
stat -e EVENT -a
要一次性统计多种类型的事件,请列出这些事件并以逗号分隔。例如,要统计 cpu-cycles
和 instructions
,请使用:
#
perf
stat -e cpu-cycles,instructions -a
要停止会话,请按 Ctrl–C。
还可以统计某个事件在特定时间范围内发生的次数:
#
perf
stat -e EVENT -a -- sleep TIME
请将 TIME 替换为以秒为单位的值。
6.6 记录特定于特定命令的事件 #
可通过各种方式来对特定于特定命令的事件采样:
要创建新调用的命令的报告,请使用:
#
perf
record COMMAND然后正常使用启动的进程。退出该进程时,Perf 会话也会停止。
要在运行新调用的命令时创建整个系统的报告,请使用:
#
perf
record -a COMMAND然后正常使用启动的进程。退出该进程时,Perf 会话也会停止。
要创建已运行的进程的报告,请使用:
#
perf
record -p PID请将 PID 替换为进程 ID。要停止会话,请按 Ctrl–C。
现在,可使用以下命令查看收集到的数据 (perf.data
):
>
perf
report
这会打开一个伪图形界面。要获得帮助,请按 H。要退出,请按 Q。
如果您偏向于使用图形界面,请尝试 Perf 的 GTK+ 界面:
>
perf
report --gtk
但请注意,GTK+ 界面的功能很有限。
6.7 更多信息 #
本章仅提供了简短概述。有关详细信息,请参考以下链接:
- https://perf.wiki.kernel.org/index.php/Main_Page
项目主页。还提供了有关使用
perf
的教程。- http://www.brendangregg.com/perf.html
包含许多单行
perf
用法示例的非官方页。- http://web.eece.maine.edu/~vweaver/projects/perf_events/
包含多个资源的非官方页,主要与 Perf 的 Linux 内核代码及其 API 相关。例如,此页包含 CPU 兼容性表和编程指南。
- https://www-ssl.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-3b-part-2-manual.pdf
此 Intel Architectures Software Developer's Manual, Volume 3B.
- https://support.amd.com/TechDocs/24593.pdf
此 AMD Architecture Programmer's Manual, Volume 2.
- 第 7 章 “OProfile — 系统范围的分析器”
请参阅此章了解其他性能优化。