擷取建構效能指標

回報問題 查看來源

幾乎每個 Bazel 使用者都曾經歷過慢或比預期慢的建構作業。對於具有重大影響的目標,改善個別建構的效能具有特定值,例如:

  1. 核心開發人員目標經常疊代及建構 (重新建構)。

  2. 普遍依賴其他目標的常見程式庫。

  3. 如果目標類別 (例如自訂規則) 有代表性目標,只要在單一版本中診斷及修正問題,可能有助於大規模解決問題。

瞭解資源使用位置,是改善建構效能的重要步驟。本頁面列出您可以收集的各種指標。細分建構效能展示如何使用這些指標偵測及修正建構效能問題。

從 Bazel 建構作業擷取指標的主要方式有以下幾種:

建立事件通訊協定 (BEP)

Bazel 會透過 Build Event Protocol (BEP) 輸出各種通訊協定緩衝區 build_event_stream.proto,而這些通訊協定可由您指定的後端匯總。視您的用途而定,您可能會決定以各種方式匯總指標,但以下將說明一些一般需要考量的概念和 proto 欄位。

Bazel 的查詢 / cquery / 查詢指令

Bazel 提供 3 種不同的查詢模式 (查詢cquery查詢),可讓使用者分別查詢目標圖表、設定的目標圖表和動作圖表。查詢語言提供一系列的函式,可在不同查詢模式中使用,讓您可以根據自身需求自訂查詢。

JSON 追蹤記錄設定檔

針對任何類似建構的 Bazel 叫用,Bazel 都會以 JSON 格式寫入追蹤記錄設定檔。如要快速瞭解 Bazel 在叫用期間花費的時間,JSON 追蹤記錄設定檔將非常實用。

執行記錄

由於機器和環境差異或非確定性動作,執行記錄可協助您排解及修正缺少的遠端快取命中問題。如果您傳遞的標記為 --experimental_execution_log_spawn_metrics (可使用 Bazel 5.2),其中也會包含詳細的產生指標,這些指標適用於本機和遠端執行的動作。舉例來說,您可以使用這些指標來比較本機和遠端電腦的效能,或是發現產生執行的哪個部分持續比預期慢 (例如因為排入佇列)。

執行圖記錄

雖然 JSON 追蹤記錄設定檔含有重要路徑資訊,但有時您會需要「已執行動作」的依附元件圖表上的額外資訊。從 Bazel 6.0 開始,您可以傳遞標記 --experimental_execution_graph_log--experimental_execution_graph_log_dep_type=all,以便寫入關於執行動作及其跨依附元件的記錄。

這項資訊可用來瞭解重要路徑上節點所新增的拖曳動作。拖曳是指從執行圖中移除特定節點可以節省的時間。

該資料可協助您預先預測建構和動作圖變更所造成的影響,再實際執行。

使用 bazel-bench 進行基準測試

Bazel bench 是 Git 專案的基準測試工具,可在下列情況中為建構效能執行基準測試:

  • 專案基準:在單一 Bazel 版本上,將兩個 Git 修訂版本相互基準測試。用於偵測建構作業中的迴歸 (通常透過新增依附元件)。

  • Bazel 基準:在單一 Git 修訂版本中將兩個 Bazel 版本相互比較。用於偵測 Bazel 本身中的迴歸 (如果您遇到維護 / 分支 Bazel 的情況)。

基準測試會監控實際時間、CPU 時間和系統時間,以及 Bazel 的保留堆積大小。

建議在並未執行其他程序的專屬實體機器上執行 Bazel bench,以減少變異性的來源。