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

如果您希望將測試輸出保留在當前工作目錄之外,以便進行長期儲存和檢查,則可能需要設定上述環境變數。