擷取建構效能指標

回報問題 查看來源 Nightly · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

想必每位 Bazel 使用者都曾遇到建構作業緩慢或比預期慢的情況。改善個別建構版本的效能,對於影響重大的目標特別有價值,例如:

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

  2. 其他目標廣泛依賴的常見程式庫。

  3. 從目標類別 (例如自訂規則) 中選取代表性目標,診斷及修正一個建構版本中的問題,可能有助於解決大規模問題。

如要提升建構作業的效能,重要步驟之一就是瞭解資源的耗用情況。這個頁面列出可收集的不同指標。建構作業效能細目:說明如何使用這些指標偵測及修正建構作業效能問題。

從 Bazel 建構作業中擷取指標的主要方式有幾種,包括:

建構事件通訊協定 (BEP)

Bazel 會透過 Build Event Protocol (BEP) 輸出各種通訊協定緩衝區 build_event_stream.proto,這些緩衝區可由您指定的後端彙整。視您的用途而定,您可能會決定以各種方式匯總指標,但我們將在此介紹一些一般而言有用的概念和原型欄位。

Bazel 的 query / cquery / aquery 指令

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

JSON 追蹤記錄檔

對於每個類似建構的 Bazel 叫用,Bazel 都會以 JSON 格式寫入追蹤設定檔。JSON 追蹤設定檔有助於快速瞭解 Bazel 在叫用期間耗費的時間。

執行記錄

執行記錄可協助您排解及修正因機器和環境差異或非決定性動作,而導致遠端快取命中次數不足的問題。如果您傳遞 --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 基準測試,以減少變異來源。