最佳化疊代速度

回報問題 查看來源

本頁說明如何在重複執行 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 伺服器。