每位 Bazel 使用者都可能遇到建構速度比預期慢的情況。改善個別版本的成效,對於影響重大的目標特別有價值,例如:
經常重複執行及重建的核心開發人員目標。
其他目標廣泛依賴的常用程式庫。
從一類目標中選出代表性目標 (例如自訂規則),在一個版本中診斷及修正問題,或許有助於解決更大規模的問題。
如要改善建構作業的成效,請務必瞭解資源的用途。這個頁面會列出可收集的不同指標。剖析建構效能一文說明如何使用這些指標來偵測及修正建構效能問題。
從 Bazel 建構作業中擷取指標的方法有幾種,包括:
建構事件通訊協定 (BEP)
Bazel 會透過 Build Event Protocol (BEP) 輸出各種通訊協定緩衝區 build_event_stream.proto
,這些緩衝區可由您指定的後端匯總。視用途而定,您可以決定以各種方式匯總指標,但我們會在這裡介紹一些概念和 Proto 欄位,這些概念和欄位通常都很實用。
Bazel 的 query / cquery / aquery 指令
Bazel 提供 3 種不同的查詢模式 (query、cquery 和 aquery),可讓使用者分別查詢目標圖表、已設定的目標圖表和動作圖表。查詢語言提供可在不同查詢模式下使用的一組函式,讓您可以根據需求自訂查詢。
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 基準測試,以減少變化來源。