記錄 CPU 效能追蹤記錄

說明

CPU 效能監控器追蹤提供者可讓使用者使用 Fuchsia 追蹤系統,存取 CPU 內建的效能計數器。

這項功能目前僅適用於 Intel 晶片組。

在 Intel 上,效能監控器可以為使用者提供有關 CPU 許多方面的統計資料。如需完整的可用效能事件清單,例如Skylake 晶片請參閱 Intel 第 3 章第 19.2 章,第 6 代和第 7 代處理器的效能監控事件。目前並非所有事件 (或「計數器」) 都可使用,但會有許多(!),但希望目前還會提供許多有用的事件。

以下是一些例子:

  • L1、L2、L3 的快取命中/遺失
  • 個週期因快取失敗而停滯
  • 分支版本錯誤預測
  • 操作說明已淘汰

追蹤系統使用「類別」來指定要收集的追蹤記錄資料。Cpuperf 會使用這些類別來簡化要啟用的 H/w 事件規格。您可以在這個目錄的 .inc 檔案中,找到完整的類別組合。以下說明一組具有代表性的類別。

如要收集追蹤記錄資料,請在主體機器上執行 ffx trace start,或直接在 Fuchsia 裝置上執行 trace

例子:

$ categories="gfx"
$ categories="$categories,cpu:fixed:unhalted_reference_cycles"
$ categories="$categories,cpu:fixed:instructions_retired"
$ categories="$categories,cpu:l2_lines,cpu:sample:10000"
$ ffx trace start --buffer-size 64 --duration 2 --categories $categories

在電腦上取得 .fxt 檔案後,您可以將其載入 Perfetto 檢視器

如果您使用 traceutil,要輕鬆查看追蹤記錄,就是載入 traceutil 產生的對應 .html 檔案。作者發現,在頂層 Fuchsia 目錄中執行 traceutil 時,最簡單的方式是在 Chrome 中查看該目錄 (例如file:///home/dje/fnl/ipt/fuchsia).

基本作業

效能資料收集的基本作業是為每個 CPU 的追蹤記錄記錄分配緩衝區,然後設定計數器 (在每個 CPU 上),在發生預先指定的事件數量後觸發中斷情形。這項中斷稱為 PMI 中斷 (效能監控器中斷)。在 Intel 上,中斷服務會在計數器溢位時觸發中斷服務,這時中斷服務處理常式會將各種資訊 (例如時間戳記和程式計數器) 寫入追蹤緩衝區,重設計數器,以便在預先指定的事件數後重新觸發另一項中斷情形,並傳回。

追蹤停止時,Cpuperf 追蹤提供者會讀取緩衝區,並轉換為 Trace Manager 使用的追蹤格式。

當緩衝區填滿時,追蹤也會停止。請注意,使用的是內部緩衝區,因此不支援循環和串流模式 (目前) 不支援。系統可收集的追蹤記錄資料量取決於多項因素:

  • 追蹤記錄的時間長度
  • 緩衝區大小
  • 取樣頻率
  • 計數器溢位的頻率
  • 是否將程式計數器資訊寫入緩衝區

資料收集類別

如前文所述, Fuchsia 追蹤系統使用「類別」來指定要收集的資料。針對 CPU 追蹤,您可以透過幾種類別指定要啟用的計數器、是否要追蹤 OS 或使用者空間,或同時追蹤兩者,並指定取樣頻率。

如要瞭解各個效能計數器,請參閱 Intel 說明文件。本文件不會嘗試提供每個計數器的詳細資訊。

取樣率

系統會依據使用者指定的速率收集各個計數器的資料。最終可以隨機指定費率。與此同時,系統支援下列費率組合:

  • CPU:sample:100
  • CPU:sample:500
  • CPU:sample:1000
  • CPU:sample:5000
  • CPU:sample:10000
  • CPU:sample:50000
  • CPU:sample:100000
  • CPU:sample:500000
  • CPU:sample:1000000

獨立取樣

根據預設,每個計數器都會單獨取樣。舉例來說,如果其中一個要求「cpu:fixed:instructions_retired」和「arch:llc」(最終快取快取 - L3),取樣率為 10000,則淘汰的操作說明將每 10000 個「指示淘汰」事件取樣,而每 10000 個「LLC」事件都會取樣,數量則超過每 10000 個 LLC 事件取樣。每個樣本都會收集時間戳記,方便他們知道花費的時間,例如淘汰 10000 指令。

根據時間取樣

有些計數器可用於「時間基數」。在時間序列模式中,系統會用一個計數器驅動所有計數器的資料收集作業,而不是以自己的速率收集每個計數器。這有助於你更一致地瞭解事件。另一方面,這表示我們不會再收集每個事件的統計電腦資料 (因為我們只會有時間基事件的電腦值)。除了時間基數計數器之外,您也必須提供取樣率。

請參閱以下內容,瞭解撰寫本寫內容時的一組時間基礎計數器,以及目前集來源樹狀結構中的 src/performance/cpuperf_provider/intel-timebase-categories.inc

記錄模式

Tally 模式是較簡單的替代方案,可在整個追蹤記錄執行期間收集每個事件的計數,然後回報這些事件。

Tally 模式是透過「cpu:tally」類別 (而非其中一個「cpu:sample:*」類別) 啟用。

例子:

$ categories="cpu:l2_summary"
$ categories="$categories,cpu:fixed:unhalted_reference_cycles"
$ categories="$categories,cpu:fixed:instructions_retired"
$ categories="$categories,cpu:mem:bytes,cpu:mem:requests"
$ categories="$categories,cpu:tally"
$ ffx trace start --buffer-size 64 --duration 2 --categories $categories

選項

  • cpu:os - 針對在核心空間中執行的程式碼收集資料。

  • cpu:user - 針對在使用者空間中執行的程式碼收集資料。

  • cpu:pc - 收集與每個事件相關聯的電腦資料

如果您想瞭解通常發生快取失敗的位置,例如一般而言是快取失敗,這種做法就很實用 (視取樣率而定)。每個範例的位址空間和程式計數器都會包含在追蹤記錄輸出中。不過,這麼做會使每筆追蹤記錄的大小加倍,因此需要權衡利弊。

固定計數器

Intel 架構提供三個「固定」計數器:

  • cpu:fixed:instructions_retired

  • cpu:fixed:unhalted_core_cycles

  • cpu:fixed:unhalted_reference_cycles

這些計數器並未使用可程式化的計數器,因此「已修正」。其中三者各有固定使用權限。這種做法的優點在於他們並未使用可程式化的計數器:這裡有數十個計數器,但視模型而定,一次最多只能使用四個。

可程式計數器

Skylake (和 Kaby Lake) 晶片上提供數十個可編寫的計數器。如需完整清單,請參閱 Intel 第 3 章第 19.2 章、第 6 代和第 7 代處理器的效能監控事件。如需目前支援的清單,請參閱來源樹狀結構中的 zircon/system/ulib/zircon-internal/include/lib/zircon-internal/device/cpu-trace/intel-pm-events.inczircon/system/ulib/zircon-internal/include/lib/zircon-internal/device/cpu-trace/skylake-pm-events.inc

為了簡化指定可程式計數器的指定程序,這些計數器已在來源樹狀結構的 src/performance/cpuperf_provider/intel-pm-categories.incsrc/performance/cpuperf_provider/skylake-pm-categories.inc 中分為不同類別。請查看這些檔案的完整清單。

一次只能指定其中一個類別。[稍後我們會進一步控管要收集哪些資料。]

以下提供一些實用類別:

  • cpu:arch:llc

    • 最後層級快取 (L3) 參照
    • 最後層級快取 (L3) 遺失
  • cpu:arch:branch

    • 分支版本操作說明已淘汰
    • 分支版本指示有誤
  • cpu:skl:l1_summary

    • 每個週期的待處理 L1D 缺漏數量
    • 這個處理器核心中任何邏輯執行緒的待處理 L1D 失敗次數
    • 導入 L1 資料快取的行數
  • cpu:skl:l2_summary

    • 錯過 L2 的需求要求
    • 所有錯過 L2 的要求
    • 所有對 L2 的需求資料讀取要求
    • 所有傳送至 L2 的要求
  • cpu:skl:l3_summary

    • 由參照 L3 中快取行的核心要求
    • L3 參照的快取失敗條件
  • cpu:skl:offcore_demand_code

    • SQ 中未核心的待處理需求程式碼讀取交易次數在每個週期中遞增至不核心
    • 在 SQ 到取消核心且至少 1 項待處理需求程式碼讀取交易的循環
  • cpu:skl:offcore_demand_data

    • 將 SQ 中未核心的待處理需求資料讀取交易次數逐週期遞增
    • 從 SQ 到非核心且至少 1 項待處理需求資料讀取交易的循環
    • 從 SQ 到取消核心且至少 6 項未完成的需求資料讀取交易的循環
  • cpu:skl:l1_miss_cycles

    • L1 資料缺失需求負載不佳時的循環
    • 執行延遲,而 L1 資料遺失需求負載過高
  • cpu:skl:l2_miss_cycles

    • L2 錯失需求負載良好時循環
    • 執行停滯,而 L2 無法滿足需求負載良好
  • cpu:skl:l3_miss_cycles

    • L3 錯失需求負載良好時循環
    • L3 需求負載落後,持續停滯不前
  • cpu:skl:mem_cycles

    • 記憶體子系統有卸載的負載,而循環
    • 執行暫停,而記憶體子系統有負的負載

計時器計數器

這些計數器可當做時間基數。日後會加入更多產品。

  • cpu:timebase:fixed:instructions_retired

    • 與 cpu:fixed:instructions_retired 相同
  • cpu:timebase:fixed:unhalted_reference_cycles

    • 與 cpu:fixed:unhalted_reference_cycles 相同的計數器