本頁說明重複執行 Bazel 時,如何最佳化 Bazel 的建構效能。
Bazel 的執行階段狀態
Bazel 叫用作業涉及多個互動部分。
bazel
指令列介面 (CLI) 是面向使用者的前端工具,可接收使用者指令。CLI 工具會為每個不同的輸出基準啟動 Bazel 伺服器。Bazel 伺服器通常會持續運作,但閒置一段時間後就會關閉,以免浪費資源。
Bazel 伺服器會針對指定指令 (
build
、run
、cquery
等) 執行載入和分析步驟,並在記憶體中建構建構圖的必要部分。產生的資料結構會保留在 Bazel 伺服器中,做為分析快取的一部分。Bazel 伺服器也可以執行動作,或在設定完成後將動作傳送至遠端執行。動作執行結果也會快取在動作快取 (或執行快取,可能在本機或遠端,且可能在 Bazel 伺服器之間共用)。
Bazel 叫用結果會顯示在輸出樹狀結構中。
以疊代方式執行 Bazel
在一般開發人員工作流程中,重複建構 (或執行) 一段程式碼是很常見的事,而且通常頻率很高 (例如解決某些編譯錯誤或調查失敗的測試)。在這種情況下,相對於基礎的重複動作 (例如叫用編譯器或執行測試),重複叫用 bazel
的額外負荷越少越好。
考量到這一點,我們再次查看 Bazel 的執行階段狀態:
分析快取是重要的資料。光是冷啟動的載入和分析階段,就可能耗費大量時間 (也就是在 Bazel 伺服器啟動後或分析快取遭捨棄時執行的階段)。如果只是為了發布正式版而成功建構一次,這項成本還算可以接受,但如果重複建構相同目標,就必須攤銷這項成本,而不是在每次叫用時重複計算。
分析快取相當不穩定。首先,這是 Bazel 伺服器程序內狀態的一部分,因此如果伺服器遺失,快取也會遺失。但快取也很容易失效:舉例來說,許多 bazel
指令列標記都會導致快取遭到捨棄。這是因為許多標記會影響建構圖 (例如因為可設定的屬性)。部分標記變更也可能導致 Bazel 伺服器重新啟動 (例如變更啟動選項)。
良好的執行快取也有助於提升建構效能。執行快取可以保留在磁碟本機,也可以遠端保留。快取可在 Bazel 伺服器之間共用,開發人員之間也能共用。
避免捨棄分析快取
如果分析快取遭到捨棄或伺服器重新啟動,Bazel 會列印警告。在疊代使用期間,應避免以下任一情況:
請注意,在疊代工作流程中途變更
bazel
旗標可能會導致問題。舉例來說,如果將bazel build -c opt
與bazel cquery
混合使用,每個指令都會捨棄另一個指令的分析快取。一般來說,在特定工作流程期間,請盡量使用一組固定的標記。如果 Bazel 伺服器遺失,分析快取也會遺失。Bazel 伺服器具有可設定的閒置時間,超過這個時間就會關閉。您可以透過 bazelrc 檔案設定這個時間,以符合自身需求。啟動標記變更時,伺服器也會重新啟動,因此請盡可能避免變更這些標記。
注意:如果在 Bazel 執行期間重複按下 Ctrl-C,Bazel 伺服器就會終止。您可能會想中斷不再需要的執行中建構作業,藉此節省時間,但請只按一次 Ctrl-C,要求正常結束目前的叫用。
如要使用同一工作區的多組旗標,可以搭配
--output_base
旗標切換,使用多個不同的輸出基準。每個輸出基礎都有自己的 Bazel 伺服器。
如要將這項條件視為錯誤而非警告,可以使用 --noallow_analysis_cache_discard
標記 (Bazel 6.4.0 中導入)