Multiplex ワーカー(試験運用版)

問題を報告する ソースを表示 夜間 · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

このページでは、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 は、鍵のハッシュコード(環境変数で構成された 実行ルート、ニーモニックなど)を使用して、 使用する WorkerMultiplexerWorkerProxyは ハッシュコードが同じ場合は 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_requirementssupports-workers タグと同様) 通常のワーカーを可能にします。通常のワーカーを使用する場合と同様に、ワーカーは ルールセット レベル(たとえば、 --strategy=[some_mnemonic]=worker)、または通常は戦略レベル( 例: --dynamic_local_strategy=worker,standalone)。追加のフラグは、 できます。また、supports-multiplex-workerssupports-workers(両方が設定されている場合)。Multiplex ワーカーは --noworker_multiplex を渡します。

ルールセットでは、メモリを削減するために、可能であれば Multiplex ワーカーを使用することをおすすめします。 パフォーマンスが向上しますただし、現在のところ、Multiplex ワーカーは 動的実行と互換性がありますが、例外として 多重サンドボックスを実装しますサンドボックス化されていない多重化の実行の試行 動的に実行されるワーカーは、通知なくサンドボックス化された 使用することをおすすめします

Multiplex サンドボックス

Multiplex ワーカーは、 実装されています。単独のワーカーのサンドボックス化は 各ワーカープロセスをそれぞれのサンドボックスで実行するため、 複数の並列リクエスト間で作業ディレクトリを処理します。許可する マルチプレックス ワーカーのサンドボックス化が必要な場合、ワーカーは 各リクエストで指定されたサブディレクトリに書き込まれるのではなく、 作成されます。

多重化サンドボックスをサポートするには、ワーカーで sandbox_dir フィールドを使用する必要があります。 WorkRequest から開始し、すべてのファイルの読み取りと書き込みの接頭辞として使用します。 ただし、arguments フィールドと inputs フィールドは、サンドボックス化されていない状態から変更されません。 実際の入力は sandbox_dir を基準とします。ワーカーは argumentsinputs にあるファイルパスを変換し、ここから読み取ります sandbox_dir に対するすべての出力を書き込む必要があります。 「.」などのパスや、指定したファイル内のパスが含まれます。 ("argfile" 引数など)で指定します。

ワーカーが多重化サンドボックスをサポートすると、ルールセットでこれを宣言して supports-multiplex-sandboxing を アクションの execution_requirements。Bazel は多重化サンドボックスを使用します。 --experimental_worker_multiplex_sandboxing フラグが渡された場合、または ワーカーは動的実行で使用されます

サンドボックス化された多重化ワーカーのワーカー ファイルは、引き続き ワーカー プロセスの作業ディレクトリ。したがって、ファイルが ワーカーの実行と入力の両方で使用される場合、 フラグファイル引数と、toolsexecutable、または runfiles