動態執行

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

動態執行是 Bazel 的一項功能,可同時啟動相同動作的本機和遠端執行作業,並使用第一個完成分支的輸出內容,取消其他分支。它結合了遠端建構系統的執行效能和/或大型共用快取,以及本機執行作業的低延遲時間,為清除和增量建構作業提供兩者兼具的最佳效能。

本頁面說明如何啟用、調整及偵錯動態執行。如果發生以下情況: 必須設定本機和遠端執行作業,並嘗試調整 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 助憶法預設值。遠端版本的運作方式相同。這兩種標記可以 可以多次指定如果動作無法在本機執行,則該動作會 遠端執行,反之亦然。

如果遠端系統有快取,請加上 --dynamic_local_execution_delay 旗標 在遠端系統取得 表示快取命中在快取命中時,避免執行本機執行 預設值為 1000 毫秒,但應調整為比快取命中通常所需時間稍長一點。實際時間取決於遙控器 以及往返時間通常這個值是 提供給特定遠端系統的所有使用者 (除非有部分距離太遠) 增加往返延遲時間您可以使用 Bazel 剖析 功能,方便你查看 快取命中數

動態執行可搭配本機沙箱策略使用,並搭配 永久性工作站。永久磁碟會自動執行 搭配動態執行使用時透過沙箱執行,且不能使用 multiplex 工作站。在 Darwin 和 Windows 系統上,沙箱策略可能會變慢;您可以傳遞 --reuse_sandbox_directories,以減少在這些系統上建立沙箱的額外負擔。

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

如果動態執行的其中一個分支版本先完成但失敗, 整個動作失敗這是有意選擇的做法,可避免本地和遠端執行作業之間的差異遭到忽略。

如要進一步瞭解動態執行作業及其鎖定機制,請參閱 Julio Merino 的優質網誌文章

何時該使用動態執行?

動態執行需要某種形式的遠端執行系統。 目前無法使用僅快取的遠端系統,因為快取未命中會視為失敗的動作。

並非所有類型的動作都適合遠端執行。最理想的候選項目是本機本身速度較快的項目,例如使用持續性工作站,或是執行速度夠快的項目,以致遠端執行作業的額外負擔成為執行時間的主要因素。由於每個本機執行的動作都會鎖定一定數量的 CPU 和記憶體資源,因此執行不屬於這些類別的動作,只會延遲執行屬於這些類別的動作。

5.0.0-pre.20210708.4 版本起,效能分析剖析就會包含有關 worker 執行作業的資料,包括在輸掉動態執行競爭後,完成工作要求所花費的時間。如果您發現動態執行工作站執行緒花費大量時間取得資源,或是在 async-worker-finish 中花費大量時間,表示您可能有某些緩慢的本機動作會延遲工作站執行緒。

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

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

剖析資料,以改善動態執行效能

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

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

成效

動態執行方法假設在本機和遠端都有足夠的資源,因此值得使用額外資源來改善整體效能。不過,如果資源使用量過多,可能會導致 Bazel 本身或執行 Bazel 的機器速度變慢,或是對遠端系統造成意外的壓力。另有 有幾種變更動態執行行為的選項:

--dynamic_local_execution_delay 會將特定數字延遲在本機分支的開頭 毫秒後讀取, 在目前的建構作業期間 發生遠端快取命中如此一來,當快取中可能找到大部分的輸出內容時,建構作業就不會浪費本機資源。視快取品質而定 減少這個數量或許能改善建構速度,但增加本機資源用量時 再複習一下,機構節點 是所有 Google Cloud Platform 資源的根節點

--experimental_dynamic_local_load_factor 是實驗性的進階資源管理選項。該設定的值從 0 到 1,0 會關閉。 設為高於 0 的值時,Bazel 會調整 許多動作等待 如果設為 1,就能以這個數量排定動作,數量不限 都是可用的 CPU (根據 --local_cpu_resources 計費)。值越小,設定的數字越小越好 動作的數量越多,所排定的動作數量就會越少 而且可供使用這聽起來可能不符合直覺,但隨附好遙控器 當同時執行許多動作時,本機執行作業沒有幫助 本機 CPU 較適合用來管理遠端動作

--experimental_dynamic_slow_remote_time 會在遠端分支執行至少這麼久時,優先啟動本機分支。正常情況下 最近排定的動作會優先放送,因為該動作最有可能 不過,如果遠端系統有時會停止運作或花費較多時間 這應該可以建構前進的系統這項功能預設為停用狀態,因為這可能會隱藏應修正的遠端系統問題。請確認 以便監控遠端系統的效能。

--experimental_dynamic_ignore_local_signals 可用於讓遙控器 當局部區域因特定訊號而離開時,分公司接管。這是 主要與工作站資源限制搭配使用 (請參閱 --experimental_worker_memory_limit_mb--experimental_worker_sandbox_hardening、 和 --experimental_sandbox_memory_limit_mb)), 例如工作站程序因使用過多資源而終止。

JSON 追蹤記錄設定檔包含 有助於您找出改善出價方式 並在效能和資源用量方面的取捨

疑難排解

動態執行的問題可能很難察覺,也難以偵錯,因為這些問題只會在本機和遠端執行作業的特定組合下出現。--debug_spawn_scheduler 會從動態執行系統中新增額外輸出內容,協助您對這些問題進行偵錯。您也可以調整 --dynamic_local_execution_delay 標記和遠端工作與本機工作的數量,以便更輕鬆地重現問題。

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