セルフホスト型 Bare Metal Runner
セルフホスト型 Runner とは、Bencher が管理する On-Demand または Dedicated Runner を使う代わりに、
自分自身で実行・管理する Bare Metal Runner です。
runner バイナリを Bencher API サーバーに向けると、
自分自身のハードウェア上で Job を要求して実行します。
Runner のセルフホストは、次のような場合に適しています。
- Bencher Cloud が提供していない特定のハードウェア上でベンチマークを実行したい
- ベンチマークのワークロードを自分自身のネットワーク内やエアギャップ環境に保ちたい
- Bencher Self-Hosted をエンドツーエンドで実行したい
このガイドでは、Runner の登録、Spec によるそのハードウェアの記述、両者の連携、
そして runner バイナリの起動までを順に説明します。
Runner、Spec、Sandbox、Job がどのように組み合わさるかの概念的な概要については、
Bare Metal の概要 を参照してください。
🐰 Firecracker のサンドボックス化には、KVM が有効になった Linux が必要です。 サンドボックスなしの Spec のみを提供する Runner は、サポートされている任意のホスト上で実行できます。
Runner を作成する
Runner は、runner バイナリを Bencher API サーバーに対して認証するリソースです。
bencher CLI、Runners REST API、
または Bencher Console で作成します。
bencher runner create \ --host https://api.bencher.example.com \ --name "My Runner"Bencher は新しい Runner をそのキーとともに返します。
{ "uuid": "...", "key": "bencher_runner_..."}キーは一度だけ表示されるため、安全に保管してください。
Runner を起動する際に、このキーを runner バイナリに渡します。
キーを紛失または漏洩した場合は、POST /v0/runners/{runner}/key API でローテーションします。
これにより、以前のキーは直ちに無効化されます。
Spec を作成する
Spec は、Runner が提供するハードウェアを記述します。 オペレーティングシステム、CPU アーキテクチャ、Sandbox の種類、CPU 数、メモリ、ディスク、ネットワークアクセスです。 Job は必要とする Spec を宣言し、Runner はサポートする Spec の Job のみを要求します。
bencher CLI、Specs REST API、
または Bencher Console で Spec を作成します。
bencher spec create \ --host https://api.bencher.example.com \ --name "Intel v1" \ --os linux \ --architecture x86_64 \ --sandbox firecracker \ --cpu 4 \ --memory 51539607552 \ --disk 137438953472サンドボックスなしの Spec を定義するには --sandbox を省略し、
この Spec の Job にネットワークアクセスを許可する場合は --network を渡します。
メモリとディスクはバイト単位で指定します。
Spec の詳細と、Testbed が各 Report で使用された Spec をどのように記録するかについては、
Testbed と Spec を参照してください。
Spec を Runner に割り当てる
Runner Spec は、Spec を Runner に紐付けます。 1 つの Runner は複数の Spec をサポートでき、1 つの Spec は複数の Runner からサポートされ得ます。 Runner は、割り当てられた Spec の Job のみを要求します。
bencher CLI
または Runner Specs REST API で Spec を Runner に追加します。
bencher runner spec add my-runner \ --host https://api.bencher.example.com \ --spec intel-v1後で紐付けを解除するには、DELETE /v0/runners/{runner}/specs/{spec} API を使用します。
Runner を起動する
Runner を作成し、少なくとも 1 つの Spec を割り当てたら、
runner up でハードウェア上の runner バイナリを起動します。
API サーバーのホスト、Runner の UUID またはスラッグ、そして Runner キーを、
フラグまたは環境変数として指定します。
runner up \ --host https://api.bencher.example.com \ --runner my-runner \ --key bencher_runner_...export BENCHER_HOST=https://api.bencher.example.comexport BENCHER_RUNNER=my-runnerexport BENCHER_RUNNER_KEY=bencher_runner_...runner uprunner バイナリは API サーバーへの単一の WebSocket 接続 を開き、
自身の Spec に一致する Job をポーリングし、それぞれを実行して結果を報告します。
接続は複数の Job にわたって開いたままになり、
新しいバージョンが利用可能になると、バイナリは Job の合間に 自身を更新します。
デフォルトでは、Runner は Sandbox のない Spec の Job をすべて拒否します。
Runner にサンドボックスなしの Job をホスト上で直接実行させるには、
--danger-allow-no-sandbox フラグ を付けて起動します。
runner uprunner upRunner を起動し、ベンチマーク Job をポーリングして実行します。 これは セルフホスト型 Runner を運用するために使う、長時間実行コマンドです。 Runner は API サーバーへの単一の WebSocket 接続 を開き、 自身の Spec に一致する Job を要求し、それらを実行して結果を報告します。
runner up [OPTIONS]オプション
--host <HOST>接続先の Bencher API サーバー。 デフォルトでは
https://api.bencher.devが使用されます。BENCHER_HOST環境変数でも設定できます。--runner <RUNNER>運用する Runner の UUID またはスラッグ。
BENCHER_RUNNER環境変数でも設定できます。--key <KEY>Runner が作成された ときに返された Runner 認証キー (
bencher_runner_...)。BENCHER_RUNNER_KEY環境変数でも設定できます。--poll-timeout <POLL_TIMEOUT>Job を待機する際のロングポーリングのタイムアウト (秒)。
1から900の範囲です。 デフォルトでは55が使用されます。--danger-allow-no-sandboxSandbox なしでの Job の実行を許可します。 このフラグがない場合、Sandbox を持たない Spec の Job は実行時に拒否されます。 サンドボックスなしの Job はホスト上で直接実行されるため、信頼できるワークロードに対してのみ有効にしてください。
BENCHER_DANGER_ALLOW_NO_SANDBOX環境変数でも設定できます。--sandbox-log-level <SANDBOX_LOG_LEVEL>サンドボックスプロセスのログレベル。 デフォルトでは
warningが使用されます。--no-auto-updateサーバーからの自動更新を無効にします。 デフォルトでは、サーバーが新しいバージョンを提供すると、Runner は Job の合間に自身を更新します。
BENCHER_NO_AUTO_UPDATE環境変数でも設定できます。--max-download-size <MAX_DOWNLOAD_SIZE>自己更新バイナリの最大ダウンロードサイズ (バイト)。 デフォルトでは
500MiB が使用されます。--no-auto-updateと競合します。--max-output-size <MAX_OUTPUT_SIZE>収集される
stdoutとstderrの最大サイズ (バイト)。 デフォルトでは25MiB が使用されます。--max-file-count <MAX_FILE_COUNT>デコードする出力ファイルの最大数。 デフォルトでは
255が使用されます。--max-symlinks <MAX_SYMLINKS>パス解決時にたどるシンボリックリンクの最大数。 Linux カーネルの
MAXSYMLINKS制限に一致します。 デフォルトでは40が使用されます。 サンドボックスなしモードでのみ使用されます。--grace-period <GRACE_PERIOD>ベンチマーク終了後、最終的な出力収集までの猶予期間 (秒)。
ホストチューニング
各ベンチマークの前に、
runnerは測定ノイズを低減するためにホストチューニングを適用します。 デフォルトでは、ASLR、NMI ウォッチドッグ、SMT / ハイパースレッディング、ターボブーストを無効にし、 CPU スケーリングガバナーをperformance、swappiness を10、perf_event_paranoidを-1に設定します。 以下のフラグは、個々の最適化を無効にせず、ホストのデフォルト値のまま維持します。--no-tuningすべてのホストチューニング最適化を無効にします。
--aslrASLR を有効のまま維持します (デフォルト: ベンチマークでは無効)。
--nmi-watchdogNMI ウォッチドッグを有効のまま維持します (デフォルト: ベンチマークでは無効)。
--smtSMT / ハイパースレッディングを有効のまま維持します (デフォルト: ベンチマークでは無効)。
--turboターボブーストを有効のまま維持します (デフォルト: ベンチマークでは無効)。
--swappiness <SWAPPINESS>swappiness の値を設定します。 デフォルトでは
10が使用されます。--governor <GOVERNOR>CPU スケーリングガバナーを設定します。 デフォルトでは
performanceが使用されます。--perf-event-paranoid <PERF_EVENT_PARANOID>perf_event_paranoidの値を設定します。 デフォルトでは-1が使用されます。--helpヘルプを表示します。
すべてのオプションについては runner CLI リファレンスを、
サーバーとやり取りされるメッセージについては Runner プロトコル リファレンスを参照してください。
セルフホスト型 Runner のワークフロー
Runner が接続されると、他の Bare Metal Runner と同じ方法でベンチマークを送信します。
Image をビルドしてプッシュし、一致する Spec で bencher run --image を実行します。
以下の図は、Runner の登録から Job の実行までの全体の流れを示しています。