このページでは、Multiplex ワーカーについて説明します。また、Multiplex 互換のワーカーを記述する方法、 特定の制限の回避策が記載されています
Multiplex ワーカーを使用すると、Bazel は単一のワーカーで複数のリクエストを処理できます。 プロセスですマルチスレッド ワーカーの場合、Bazel はより少ないリソースを使用して 同じかそれ以上のパフォーマンスが得られますたとえば 1 台のマシンに 1 台の Bazel では 4 つの多重化ワーカーがあり、これらのワーカー間で 同じワーカー プロセスで処理されるため、リクエストを並行して処理できます。対象 Java や Scala などの言語がサポートされており、JVM のウォームアップ時間と JIT コンパイルが削減されます。 通常は、すべてのワーカー間で 1 つの共有キャッシュを 使用できます。
概要
Bazel サーバーとワーカー プロセスの間には、2 つのレイヤがあります。特定の
プロセスを並列実行できるメモリー、Bazel は WorkerProxy
を取得します
作成されます。WorkerProxy
がリクエストをワーカー プロセスに転送する
request_id
とともに順番に呼び出されると、ワーカー プロセスがリクエストを処理し、
レスポンスを WorkerMultiplexer
に送信します。WorkerMultiplexer
レスポンスを受信すると、request_id
を解析してレスポンスを転送します。
正しいWorkerProxy
に戻ります。非多重化ワーカーの場合と同様に、
標準的な入出力で通信が行われますが、
stderr
: ユーザーに表示される出力(下記を参照)。
各ワーカーにはキーがあります。Bazel は、鍵のハッシュコード(環境変数で構成された
実行ルート、ニーモニックなど)を使用して、
使用する WorkerMultiplexer
。WorkerProxy
は
ハッシュコードが同じ場合は WorkerMultiplexer
。したがって
単一の Bazel では、環境変数と実行ルートが同じである
各ニモニックには、1 つの WorkerMultiplexer
と 1 つのニモニックのみを含めることができます。
プロセスです。ワーカーの合計数(通常のワーカーと
WorkerProxy
は引き続き --worker_max_instances
によって制限されます。
Multiplex 互換ルールの作成
このルールのワーカー プロセスは、マルチスレッド型である必要があります。
マルチプレックスワーカーですProtobuf では、ルールセットが単一のリクエストを解析することも、
ストリームに複数のリクエストが
溜まる場合がありますこの
ワーカー プロセスがストリームからのリクエストを解析すると、
新しいスレッドを作成します。別のスレッドが完了してストリームに書き込まれる可能性があるため、
同時に、ワーカー プロセスでレスポンスが確実に書き込まれ、
自動的に実行されます(メッセージは重複しません)。レスポンスには
処理するリクエストの request_id
。
Multiplex 出力の処理
Multiplex ワーカーは出力の処理に
使用する必要がありますstderr
に送信されたすべてのログは、1 つのログファイルに記録されます。
同じタイプのすべての WorkerProxy
で共有され、
同時リクエスト間でランダムにインターリーブされます。stdout
のリダイレクト中
出力を stderr
に出力するのは良い考えですが、出力を output
WorkResponse
のフィールドで識別されます。これは、ユーザーが出力の一部をマングリングして表示される可能性があるためです。
ツールがユーザー指向の出力を stdout
または stderr
にのみ送信する場合、
動作を変更する必要があります。
Multiplex ワーカーの有効化
Multiplex ワーカーはデフォルトでは有効になっていません。ルールセットを使用すると、
supports-multiplex-workers
タグを使用して
アクションの execution_requirements
(supports-workers
タグと同様)
通常のワーカーを可能にします。通常のワーカーを使用する場合と同様に、ワーカーは
ルールセット レベル(たとえば、
--strategy=[some_mnemonic]=worker
)、または通常は戦略レベル(
例: --dynamic_local_strategy=worker,standalone
)。追加のフラグは、
できます。また、supports-multiplex-workers
は
supports-workers
(両方が設定されている場合)。Multiplex ワーカーは
--noexperimental_worker_multiplex
を渡します。
ルールセットでは、メモリを削減するために、可能であれば Multiplex ワーカーを使用することをおすすめします。 パフォーマンスが向上しますただし、現在のところ、Multiplex ワーカーは 動的実行と互換性がありますが、例外として 多重サンドボックスを実装しますサンドボックス化されていない多重化の実行の試行 動的に実行されるワーカーは、通知なくサンドボックス化された 使用することをおすすめします
Multiplex サンドボックス
Multiplex ワーカーは、 実装されています。単独のワーカーのサンドボックス化は 各ワーカープロセスをそれぞれのサンドボックスで実行するため、 複数の並列リクエスト間で作業ディレクトリを処理します。許可する マルチプレックス ワーカーのサンドボックス化が必要な場合、ワーカーは 各リクエストで指定されたサブディレクトリに書き込まれるのではなく、 作成されます。
多重化サンドボックスをサポートするには、ワーカーで sandbox_dir
フィールドを使用する必要があります。
WorkRequest
から開始し、すべてのファイルの読み取りと書き込みの接頭辞として使用します。
ただし、arguments
フィールドと inputs
フィールドは、サンドボックス化されていない状態から変更されません。
実際の入力は sandbox_dir
を基準とします。ワーカーは
arguments
と inputs
にあるファイルパスを変換し、ここから読み取ります
sandbox_dir
に対するすべての出力を書き込む必要があります。
「.」などのパスや、指定したファイル内のパスが含まれます。
("argfile" 引数など)で指定します。
ワーカーが多重化サンドボックスをサポートすると、ルールセットでこれを宣言して
supports-multiplex-sandboxing
を
アクションの execution_requirements
。Bazel は多重化サンドボックスを使用します。
--experimental_worker_multiplex_sandboxing
フラグが渡された場合、または
ワーカーは動的実行で使用されます
サンドボックス化された多重化ワーカーのワーカー ファイルは、引き続き
ワーカー プロセスの作業ディレクトリ。したがって、ファイルが
ワーカーの実行と入力の両方で使用される場合、
フラグファイル引数と、tools
、executable
、または
runfiles
。