動態執行

回報問題 查看原始碼 。 。 。 。 夜間。 。 7.3 。 。 7.2 。 。 7.1 。 。 7.0 。 。 6.5

動態執行是 Bazel 中的一項功能 自 0.21 版起, 同時啟動相同動作的本機與遠端執行作業 您可以使用處理後第一個分支版本的輸出內容,將另一個分支版本的輸出內容取消 可結合遠端的執行能力和/或大量共用快取 同時具備本機執行作業的低延遲特性,可提供兩者間的優勢 以便進行乾淨和漸進式建構作業

本頁面說明如何啟用、調整及偵錯動態執行。如果發生以下情況: 必須設定本機和遠端執行作業,並嘗試調整 Bazel 您可以參考這個網頁如果還沒有 設定遠端執行,請前往 Bazel 請先遠端執行總覽

要啟用動態執行功能嗎?

動態執行模組屬於 Bazel 的一部分,但要使用動態執行 因此,您必須已能在本機和遠端編譯兩者 使用相同的 Bazel 設定

如要啟用動態執行模組,請傳遞 --internal_spawn_scheduler 加到 Bazel這會新增名為 dynamic 的新執行策略。您現在可以 以此做為目標動態執行的策略,例如 --strategy=Javac=dynamic。請參閱下一節,瞭解如何挑選助聽器 即可啟用動態執行功能

對使用動態策略的任何記憶來說,遠端執行策略就是 取自 --dynamic_remote_strategy 旗標,以及來自 --dynamic_local_strategy 標記。傳球員 --dynamic_local_strategy=worker,sandboxed 會設定本機的 嘗試在工作站或沙箱執行環境中使用工作站或沙箱執行 順序。傳遞 --dynamic_local_strategy=Javac=worker 會覆寫預設值 只有 Javac 記憶法。遠端版本的運作方式相同。這兩種標記可以 可以多次指定如果動作無法在本機執行,則該動作會 遠端執行,反之亦然。

如果遠端系統有快取,--local_execution_delay 旗標會在遠端系統後,在本機執行作業增加延遲時間 (以毫秒為單位) 表示快取命中如果有更多快取,就能避免在本機執行 則很可能預設值為 1000 毫秒,不過您應該調整為僅採用 10 毫秒 快取命中資料通常需要較長的時間。實際時間取決於 以及往返時間。此值通常會是 套用相同層級的政策,除非部分遠端系統的使用者夠長 縮短往返延遲時間您可以使用 Bazel 剖析功能 即可查看一般快取命中需要多少時間。

動態執行可搭配本機沙箱策略使用,並搭配 永久性工作站。永久工作站 和動態執行搭配使用時,會自動以沙箱機制執行,而且無法 使用多工工作站。在 Darwin 和 Windows 系統上 沙箱策略的速度可能較慢也可以 --reuse_sandbox_directories 可減少在這些系統上建立沙箱的負擔。

動態執行也可以使用 standalone 策略執行,不過因為 standalone 策略必須在開始執行時採用輸出鎖定, 有效地阻止遠端策略。 --experimental_local_lockfree_output 旗標可透過下列方式解決這個問題 允許本機執行作業直接寫入輸出中,但 遠端執行應該先完成這個動作

如果動態執行的其中一個分支版本先完成但失敗, 整個動作失敗這是我們刻意的選擇 本機和遠端執行之間不會被注意到

如需動態執行及其鎖定運作方式的更多背景資訊,請參閱 Julio Merino 的優質作品 網誌文章

何時該使用動態執行?

動態執行需要 遠端執行系統。這目前不是 只能使用快取版的遠端系統,因為快取失敗會視為快取失敗 回應失敗。

並非所有類型的動作都適合遠端執行。最佳 候選人是指本機速度更快的 您使用永久工作站或執行 速度足以讓遠端執行作業的負擔佔據大量執行時間。 每項本機執行的動作都會鎖定一定數量的 CPU 和記憶體 執行不屬於這些類別的動作只會延遲 然後替實際執行這些指令

發布後 5.0.0-pre.20210708.4, 效能分析 包含工作站執行作業的相關資料,包括完成工作所花費的時間 要求。如果看到動態執行 工作站執行緒花費大量時間取得資源,或會花費許多時間 「async-worker-finish」可能會出現某些緩慢的本地動作,導致 工作執行緒。

動態執行效能不佳分析資料

上述使用 8 Javac 工作站的設定檔中,看到許多 Javac 工作站 的比賽失敗,並在 async-worker-finish完成工作 。這可能是由於沒有員工的記憶庫 花費了足夠的資源 才能延遲工作站

以更動態的執行效能剖析資料

當只有 Javac 是在動態執行的情況下執行時,大約只有一半的開始執行 因為工人在開始工作之後,就沒辦法趕上賽跑

先前建議的 --experimental_spawn_scheduler 旗標已淘汰。 這項功能會開啟動態執行,並將 dynamic 設為所有 這種記憶法通常會導致這類問題。

疑難排解

動態執行的問題可能有些微小且難以偵錯, 只有本機和遠端執行作業的特定組合下,才會定義資訊清單。 --debug_spawn_scheduler 會針對動態內容新增額外輸出內容 可以協助偵錯問題的執行系統你也可以調整 --local_execution_delay 旗標和遠端工作與本機工作的數量 以輕鬆重現問題

如果您在使用 standalone 進行動態執行時遇到問題 策略、嘗試在不使用 --experimental_local_lockfree_output 的情況下執行 本機動作是採用沙箱機制這可能會使建構速度稍微變慢 (請參閱上方的 您是在 Mac 或 Windows 電腦上,但請移除某些失敗的原因。