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

有关更多信息,请参阅内核配置帮助。

Perf 测试 - 验证内核和用户空间 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

如果您希望将测试的输出保存在当前工作目录之外以便长期存储和检查,您可能需要设置以上这些环境变量。