CoreSight - Perf¶
- 作者:
Carsten Haitzler <carsten.haitzler@arm.com>
- 日期:
2022 年 6 月 29 日
Perf 能够本地访问 CoreSight 追踪数据并将其存储到输出 perf 数据文件中。这些数据稍后可以被解码,以提供被追踪的指令,用于调试或性能分析目的。您可以使用如下 perf record 命令记录此类数据:
perf record -e cs_etm//u testbinary
这将运行某个测试二进制文件(testbinary)直到其退出,并记录一个 perf.data 追踪文件。如果 CoreSight 正常工作,该文件将包含 AUX 部分。您可以使用如下命令将此文件的内容转储为可读文本:
perf report --stdio --dump -i perf.data
您应该会发现此文件的一些部分包含类似以下的 AUX 数据块:
0x1e78 [0x30]: PERF_RECORD_AUXTRACE size: 0x11dd0 offset: 0 ref: 0x1b614fc1061b0ad1 idx: 0 tid: 531230 cpu: -1
. ... CoreSight ETM Trace data: size 73168 bytes
Idx:0; ID:10; I_ASYNC : Alignment Synchronisation.
Idx:12; ID:10; I_TRACE_INFO : Trace Info.; INFO=0x0 { CC.0 }
Idx:17; ID:10; I_ADDR_L_64IS0 : Address, Long, 64 bit, IS0.; Addr=0x0000000000000000;
Idx:26; ID:10; I_TRACE_ON : Trace On.
Idx:27; ID:10; I_ADDR_CTXT_L_64IS0 : Address & Context, Long, 64 bit, IS0.; Addr=0x0000FFFFB6069140; Ctxt: AArch64,EL0, NS;
Idx:38; ID:10; I_ATOM_F6 : Atom format 6.; EEEEEEEEEEEEEEEEEEEEEEEE
Idx:39; ID:10; I_ATOM_F6 : Atom format 6.; EEEEEEEEEEEEEEEEEEEEEEEE
Idx:40; ID:10; I_ATOM_F6 : Atom format 6.; EEEEEEEEEEEEEEEEEEEEEEEE
Idx:41; ID:10; I_ATOM_F6 : Atom format 6.; EEEEEEEEEEEN
...
如果您看到上述内容,则您的系统正在正确追踪 CoreSight 数据。
要在 tools/perf 目录中编译支持 CoreSight 的 perf,请执行:
make CORESIGHT=1
这需要 OpenCSD 才能构建。您可以安装支持此功能的发行版软件包,例如 libopencsd 和 libopencsd-dev,或者自行下载并构建。OpenCSD 上游项目位于:
有关构建支持 CoreSight 的 perf 和更广泛用法的完整信息,请参阅:
内核 CoreSight 支持¶
您还需要在内核配置中启用 CoreSight 支持。请确保通过以下方式启用它:
CONFIG_CORESIGHT=y
您可能还需要启用各种其他 CoreSight 选项,例如:
CONFIG_CORESIGHT_LINKS_AND_SINKS=y
CONFIG_CORESIGHT_LINK_AND_SINK_TMC=y
CONFIG_CORESIGHT_CATU=y
CONFIG_CORESIGHT_SINK_TPIU=y
CONFIG_CORESIGHT_SINK_ETBV10=y
CONFIG_CORESIGHT_SOURCE_ETM4X=y
CONFIG_CORESIGHT_CTI=y
CONFIG_CORESIGHT_CTI_INTEGRATION_REGS=y
更多信息请参阅内核配置帮助。
使用 AUX 暂停和恢复进行细粒度追踪¶
Arm CoreSight 可能会生成大量的硬件追踪数据,这会导致记录开销,并在用户审查分析结果时分散注意力。为了缓解追踪数据过多的问题,Perf 提供了 AUX 暂停和恢复功能,以实现细粒度追踪。
AUX 暂停和恢复可以通过相关事件触发。这些事件可以是 ftrace 追踪点(包括静态和动态追踪点)或 PMU 事件(例如 CPU PMU 周期事件)。要创建带有 AUX 暂停/恢复功能的 perf 会话,引入了三个配置项:
“aux-action=start-paused”:为 cs_etm PMU 事件指定,以在暂停状态下启动。
“aux-action=pause”:与此项关联的事件用于暂停 AUX 追踪。
“aux-action=resume”:与此项关联的事件用于恢复 AUX 追踪。
使用 ftrace 追踪点触发 AUX 暂停和恢复的示例
perf record -e cs_etm/aux-action=start-paused/k,syscalls:sys_enter_openat/aux-action=resume/,syscalls:sys_exit_openat/aux-action=pause/ ls
使用 PMU 事件触发 AUX 暂停和恢复的示例
perf record -a -e cs_etm/aux-action=start-paused/k \
-e cycles/aux-action=pause,period=10000000/ \
-e cycles/aux-action=resume,period=1050000/ -- sleep 1
Perf test - 验证内核和用户空间 perf CoreSight 功能¶
当您运行 perf test 时,它会执行大量的自检。其中一些测试将覆盖 CoreSight(仅当启用且在 ARM64 上时)。您通常会在内核树的 tools/perf 目录中运行 perf test。一些测试将检查内部 perf 支持,例如:
检查 Arm CoreSight 追踪数据记录和合成样本 检查 Arm SPE 追踪数据记录和合成样本
其他一些测试将实际使用 perf record 和 tests/shell/coresight 中的一些测试二进制文件,并收集追踪数据以确保达到最低功能水平。启动这些测试的脚本位于同一目录中。它们都将类似于:
CoreSight / ASM 纯循环 CoreSight / Memcpy 16k 10 线程 CoreSight / 线程循环 10 线程 - 检查 TID 等。
如果工具二进制文件不存在于 tests/shell/coresight/*/ 中,这些 perf record 测试将不会运行并会被跳过。如果您的硬件不支持 CoreSight,那么请不要构建支持 CoreSight 的 perf,或者删除这些二进制文件,以便这些测试不会失败而是被跳过。
这些测试将在当前工作目录(例如 tools/perf)中记录历史结果,并命名为 stats-*.csv,例如:
stats-asm_pure_loop-out.csv stats-memcpy_thread-16k_10.csv ...
这些统计文件记录了 perf 数据输出中 AUX 数据部分的某些方面,并计算了特定编码的数量(这是一种非常简单的方法来判断其是否正常工作)。CoreSight 的一个问题是,如果需要记录的数据量足够大,可能会因处理器未能及时唤醒以从缓冲区读取所有数据等原因而丢失部分数据。您会注意到每次运行 perf test 时收集的数据量可能会有很大差异。如果您希望查看这种变化随时间推移的情况,只需多次运行 perf test,所有这些 csv 文件都将附加越来越多的数据,您以后可以检查、绘制图表或以其他方式使用这些数据来判断情况是变坏了还是变好了。
这意味着有时这些测试会失败,因为它们未能捕获所有所需数据。这是为了跟踪数据随时间产生的质量和数量,并查看何时对 Linux 内核的更改能提高追踪质量。
请注意,其中一些测试运行需要相当长的时间,特别是在处理 perf 数据文件和转储内容以检查其内部时。
您可以通过在运行 perf test 之前设置 PERF_TEST_CORESIGHT_STATDIR 环境变量来更改这些 csv 日志的存储位置,例如:
export PERF_TEST_CORESIGHT_STATDIR=/var/tmp
perf test
它们还会将生成的 perf 输出数据存储在当前目录中,以供以后检查,例如:
perf-asm_pure_loop-out.data
perf-memcpy_thread-16k_10.data
...
您可以通过设置 PERF_TEST_CORESIGHT_DATADIR 环境变量来更改 perf 数据文件的存储位置,例如:
PERF_TEST_CORESIGHT_DATADIR=/var/tmp
perf test
如果您希望将测试输出保留在当前工作目录之外,以便进行长期存储和检查,则可能需要设置上述环境变量。