最佳化疊代速度

回報問題 查看來源

本頁面說明如何在重複執行 Bazel 時,將 Bazel 的建構效能最佳化。

Bazel 的執行階段狀態

Bazel 叫用牽涉到數個互動部分。

  • bazel 指令列介面 (CLI) 是面向使用者的前端工具,可接收使用者的指令。

  • CLI 工具會為每個不同的輸出基礎啟動 Bazel 伺服器。Bazel 伺服器通常可持續運作,但閒置一段時間後就會關閉,以免浪費資源。

  • Bazel 伺服器會針對特定指令 (buildruncquery 等) 執行載入和分析步驟,並在記憶體中建構建構圖表的必要部分。產生的資料結構會在 Bazel 伺服器中保留,做為分析快取的一部分。

  • Bazel 伺服器也可以執行動作執行作業,如果設定執行此動作,則會傳送動作供遠端執行。系統也會快取動作執行的結果,也就是在本機或遠端的動作快取 (或可能是本機或遠端的執行快取,也可能與 Bazel 伺服器共用)。

  • Bazel 叫用的結果會提供在輸出樹狀結構中。

反覆執行 Bazel

在一般的開發人員工作流程中,經常建構 (或執行) 一段程式碼經常以非常高的頻率 (例如解決部分編譯錯誤或調查失敗的測試)。在這種情況下,比起基礎重複動作 (例如叫用編譯器或執行測試),重複叫用 bazel 的負擔必須盡量減少。

有鑑於此,我們將再次查看 Bazel 的執行階段狀態:

分析快取是重要的資料,冷執行作業的載入和分析階段可能需要大量時間 (例如在啟動 Bazel 伺服器後執行,或是捨棄分析快取時執行)。針對成功的單一冷建構作業 (例如用於實際工作環境的版本) 可以取得這個費用,但為了重複建構相同的目標,成本必須改算,而且不會在每次叫用時重複利用。

分析快取比較不穩定。首先,這屬於 Bazel 伺服器處理中狀態的一部分,所以如果遺失伺服器,就會失去快取。但快取也很容易「失效」:例如,許多 bazel 指令列標記會導致快取遭到捨棄。這是因為許多標記會影響建構圖表 (例如有可設定的屬性)。某些標記變更也可能導致系統重新啟動 Bazel 伺服器 (例如變更啟動選項)。

優質的執行快取對於建構效能也有幫助。執行快取可以儲存在磁碟本機或遠端上。此快取可在 Bazel 伺服器之間共用,而開發人員也能確實共用。

避免捨棄分析快取

只有在分析快取遭捨棄或伺服器重新啟動時,Bazel 才會輸出警告。疊代使用時,應避免以下其中一種做法:

  • 在疊代工作流程期間變更 bazel 旗標。舉例來說,如果將 bazel build -c optbazel cquery 搭配使用,每個指令都會捨棄另一個指令的分析快取。一般而言,您可以嘗試在特定工作流程期間使用一組固定的標記。

  • 遺失 Bazel 伺服器會失去分析快取。Bazel 伺服器具有可設定的閒置時間,之後就會關閉。您可以透過 bazelrc 檔案設定這個時間,以符合您的需求。伺服器也會在啟動標記變更時重新啟動,因此也請盡量避免變更這些標記。

  • 如果在 Bazel 執行期間重複按下 Ctrl-C,系統將終止 Bazel 伺服器。您可能會想中斷不再需要的執行中建構作業,藉此節省時間,但只要按下 Ctrl-C 一次,即可要求對目前叫用的優雅結束。

  • 如果您想從同一個工作區使用多組標記,可以使用多個不同的輸出基準,並透過 --output_base 旗標進行切換。每個輸出基礎都會取得自己的 Bazel 伺服器。