最佳化疊代速度

回報問題 查看原始碼 Nightly · 8.0 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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

如要將此條件設為錯誤而非警告,您可以使用 --noallow_analysis_cache_discard 標記 (在 Bazel 6.4.0 中推出)