多重工作站 (實驗功能)

回報問題 查看原始碼 夜間 7.4 ,直接在 Google Cloud 控制台實際操作。 7.3 7.2 7.1 7.0 6.5

本頁說明多重工作站、如何編寫與多重相容的規則,以及特定限制的解決方法。

多重工作站可讓 Bazel 透過單一工作站程序處理多個要求。以多執行緒工作站來說,Bazel 可以使用較少的資源 也能達到相同或更好的成效。舉例來說,Bazel 可讓四個多重化工作站與同一個工作站程序進行通訊,而非每個工作站都有一個工作站程序,這樣一來,系統就能並行處理要求。適用對象 Java 和 Scala 等語言,因此節省 JVM 暖機時間和 JIT 編譯時間 而且通常允許在叢集的所有工作站之間共用快取 相同類型

總覽

Bazel 伺服器和 worker 程序之間有兩個層級。對於可並行執行程序的特定助憶法,Bazel 會從工作站集區取得 WorkerProxyWorkerProxy 會將要求轉送至 worker 程序 工作站會隨著 request_id,依序處理要求 並傳送回應至 WorkerMultiplexerWorkerMultiplexer 收到回應時,會剖析 request_id,然後將回應轉寄回正確的 WorkerProxy。與非多工處理的 worker 一樣,所有通訊都會透過標準輸入/輸出完成,但工具無法只使用 stderr 來顯示使用者可見的輸出內容 (請參閱下文)。

每個 worker 都有一個鍵。Bazel 會使用金鑰的雜湊程式碼 (由環境組成 變數、執行根目錄和記憶法) 以判斷 WorkerMultiplexer即可使用。WorkerProxy 會與相同的 WorkerMultiplexer 的雜湊碼相同。因此, 單一 Bazel 中的環境變數和執行根目錄相同 則每個不重複的記憶法只能有一個 WorkerMultiplexer 和 1 工作站流程。工作站總數,包括一般工作站和 WorkerProxy仍受限於 --worker_max_instances

編寫多重相容規則

規則的工作站程序應採用多執行緒,以善用 支援多工處理Protobuf 可讓規則集剖析單一要求,即使 但串流中可能會有多個要求只要 worker 程序剖析來自串流的請求,就應在新執行緒中處理該要求。由於不同的執行緒可能會同時完成並寫入串流,因此工作程序需要確保回應是按順序寫入 (訊息不會重疊)。回應必須包含所處理要求的 request_id

處理多重輸出

相較於單工單一工作站,多工單一工作站需要更小心處理輸出內容。傳送至 stderr 的所有內容都會進入單一記錄檔案,並由所有相同類型的 WorkerProxy 共用,並在並行要求之間隨機交錯。重新導向 stdout 時 至 stderr 是個好主意,請勿在 output WorkResponse 的欄位,因為可向使用者顯示毀損的輸出內容。 如果工具只傳送使用者導向的輸出內容至 stdoutstderr,您會 必須先變更該行為,才能啟用多工工作站。

啟用 Multix 工作站

根據預設,系統不會啟用多重工作站。規則集可在動作的 execution_requirements 中使用 supports-multiplex-workers 標記來啟用多重工作站 (就像 supports-workers 標記可啟用一般工作站一樣)。與使用一般工作站的情況相同,您需要在規則集層級 (例如 --strategy=[some_mnemonic]=worker) 或一般策略層級 (例如 --dynamic_local_strategy=worker,standalone) 指定 worker 策略。如果同時設定這兩個層級,supports-multiplex-workers 會優先於 supports-workers。您可將多工工作站 傳遞 --noworker_multiplex

建議您盡可能使用多重工作者規則集,以減少記憶體壓力並提升效能。不過,除非實作多重沙箱功能,否則多重工作站目前不相容於動態執行。如果嘗試以動態執行方式執行非沙箱化的多工工作,系統會改為靜默使用沙箱化的單工工作。

多重沙箱

您可以在 worker 實作中加入明確的支援,藉此將多重工作站區隔開來。雖然單一工作站工作人員的沙箱處理作業可透過在各自的沙箱中執行每個工作站程序來完成,但多重工作站工作人員會在多個並行要求之間共用程序工作目錄。若要允許: 多工工作站的沙箱作業,工作站必須支援讀取和 寫入每個要求中指定的子目錄,而非 複製到工作目錄

如要支援多工沙箱機制,工作站必須使用 sandbox_dir 欄位 ,並把該資料當做所有讀取和寫入檔案的前置字串。WorkRequest 雖然 argumentsinputs 欄位與未隔離的請求保持不變,但實際輸入內容會與 sandbox_dir 相關。工作站必須轉譯 argumentsinputs 中的檔案路徑,才能從這個修改過的路徑讀取資料,並且必須將所有輸出內容寫入與 sandbox_dir 相關的路徑。包括「.」等路徑,以及指定檔案中路徑 (例如 "argfile" 引數)。

當 worker 支援多重沙箱功能後,規則集可以透過在動作的 execution_requirements 中加入 supports-multiplex-sandboxing,宣告這項支援。如果傳遞 --experimental_worker_multiplex_sandboxing 標記,或是使用 worker 搭配動態執行,Bazel 就會使用多重沙箱。

沙箱式多重工作站工作站的 worker 檔案仍以 worker 程序的工作目錄為基準。因此,如果檔案 兩者皆用於執行工作站和輸入,您必須同時指定 標記檔案引數及 toolsexecutablerunfiles