oha は、Web アプリケーションに負荷を送信し、rakyll/hey からインスピレーションを得たリアルタイム tui を表示する小さなプログラムです。
このプログラムは Rust で書かれており、tokio と Ratatui の美しい tui によって提供されています。
このプログラムは安定した Rust 上に構築されており、カーゴ経由でインストールするにはmake
とcmake
両方の前提条件があります。
cargo install oha
オプションで、Rustl の代わりにネイティブ TL に対して oha を構築できます。
cargo install --no-default-features --features rustls oha
vsock
機能を有効にすることで、VSOCK サポートを有効にできます。
cargo install --features vsock oha
pacman -S oha
brew install oha
winget install hatoo.oha
echo "deb [signed-by=/usr/share/keyrings/azlux-archive-keyring.gpg] http://packages.azlux.fr/debian/ stable main" | sudo tee /etc/apt/sources.list.d/azlux.list sudo wget -O /usr/share/keyrings/azlux-archive-keyring.gpg https://azlux.fr/repo.gpg apt update apt install oha
x-cmdでインストールできます。
x env を使用してください
ohaを含むコンテナイメージを構築して作成することもできます
ドッカービルド 。 -t example.com/hatoo/oha:latest
そうすれば、コンテナを通してohaを直接使用できます。
docker run -it example.com/hatoo/oha:latest https://example.com:3000
次のコマンドを使用して、PGO でoha
を構築できます。
pgo.js を実行します。
そして、バイナリはtarget/[target-triple]/pgo/oha
で利用可能になります。
Linux - Ubuntu 18.04 gnome-terminal でテスト済み
Windows 10 - Windows Powershell でテスト済み
MacOS - iTerm2 でテスト済み
-q
オプションは、rakyll/hey とは異なる動作をします。ワーカーごとではなく、1 秒あたりの全体的なクエリを設定します。
Ohayou (おはよう)、HTTP ロード ジェネレーター。tui アニメーションを備えた rakyll/hey からインスピレーションを受けています。 使用法: oha [OPTIONS]引数: ターゲット URL。 オプション: -n 実行するリクエストの数。 [デフォルト: 200] -c 同時に実行する接続の数。 `-c` を大きくする場合は、開くファイル数の制限を増やす必要があるかもしれません。 [デフォルト: 50] -p HTTP/2 で送信する並列リクエストの数。 「oha」は合計 c * p 個のワーカーを同時に実行します。 [デフォルト: 1] -z アプリケーションがリクエストを送信する期間。期間を指定した場合、n は無視されます。 HTTP/1 では、期間に達すると、進行中のリクエストは中止され、「期限による中止」としてカウントされます。この動作は `-w` オプションで変更できます。 現在、HTTP/2 では、期間に達すると、進行中のリクエストは待機されます。 `-w` オプションは無視されます。 例: -z 10s -z 3m。 -w, --デッドライン後の進行中のリクエストを待機する 期間に達すると、進行中のリクエストは待機されます。 -q すべてのレート制限 (1 秒あたりのクエリ数 (QPS)) --burst-lay 事前定義された数のリクエストの間に遅延を導入します。 注: qps が指定されている場合、バーストは無視されます。 --burst-rate バーストのリクエストのレート。デフォルトは1です 注: qps が指定されている場合、バーストは無視されます。 --rand-regex-url rand_regex クレートによって URL を生成しますが、各クエリに対してドットは無効になります (例: http://127.0.0.1/[az][az][0-9])。現在、動的スキーム、キープアライブを備えたホストおよびポートはうまく機能しません。構文の詳細については、https://docs.rs/rand_regex/latest/rand_regex/struct.Regex.html を参照してください。 --max-repeat 「--rand-regex-url」のパラメータ。 max_repeat パラメーターは、x*、x+、および x{n,} 演算子になる最大追加反復回数を指定します。 [デフォルト: 4] --dump-urls ターゲット URL を 回ダンプしてデバッグします --rand-regex-url --レイテンシー補正 遅延を修正して、調整された省略の問題を回避します。 -q が設定されていない場合は無視されます。 --no-tui リアルタイムなし tui -j, --json 結果を JSON として出力します --fps tui の 1 秒あたりのフレーム数。 [デフォルト: 16] -m, --method HTTP メソッド [デフォルト: GET] -H カスタム HTTP ヘッダー。例: -H "foo: bar" -t 各リクエストのタイムアウト。デフォルトは無限です。 -A HTTP 受け入れヘッダー。 -d HTTP リクエストの本文。 -D ファイルからの HTTP リクエスト本文。 -T コンテンツ タイプ。 -a 基本認証、ユーザー名:パスワード --http-version HTTP バージョン。使用可能な値は 0.9、1.0、1.1 です。 --http2 HTTP/2 を使用します。 --http-version=2 --host HTTP ホスト ヘッダーの短縮形 --disable-compression 圧縮を無効にします。 -r、--redirect リダイレクトの数の制限。リダイレクトしない場合は 0 を設定します。リダイレクトは HTTP/2 ではサポートされていません。 [デフォルト: 10] --キープアライブを無効にする キープアライブを無効にし、異なる HTTP リクエスト間の TCP 接続の再利用を防ぎます。これは HTTP/2 ではサポートされていません。 --no-pre-lookup キャッシュ開始時に DNS ルックアップを *実行しません* --ipv6 ipv6 のみをルックアップします。 --ipv4 ipv4 のみを検索します。 --insecure 無効な証明書を受け入れます。 --connect-to DNS 解決とデフォルトのポート番号を「example.org:443:localhost:8443」のような文字列で上書きします。 --disable-color カラー スキームを無効にします。 --unix-socket URL のドメインの代わりに UNIX ソケットに接続します。非 HTTPS URL のみ。 --stats-success-breakdown 応答ステータス コードの成功または失敗の内訳を時間ヒストグラムと分布統計に含めます --db-url 成功したリクエストを sqlite データベース URL に書き込みます EG test.db --debug 単一リクエストを実行しますリクエストとレスポンスをダンプします -h, --help ヘルプを出力します -V, --version バージョンを出力します
oha
-j
オプションが設定されている場合に JSON 出力を出力します。 JSON出力のスキーマはschema.jsonで定義されます。
ローカルサーバー上のrakyll/hey
に対するoha
のベンチマークにはhyperfine
使用しました。サーバーはnodeを使用してコーディングされました。このファイルをコピーして貼り付け、ノード経由で実行することでサーバーを起動できます。ファイルをコピー&ペーストした後、 hyperfine
経由でベンチマークを実行できます。
内容をコピーして、app.js という新しい JavaScript ファイルに貼り付けます。
const http = require("http");const server = http.createServer((req, res) => { res.writeHead(200, { "Content-Type": "text/plain" }); res.end("Hello Worldn");});server.listen(3000, () => { console.log("http://localhost:3000/ で実行されているサーバー");});
node app.js
を実行する
別のターミナル タブでhyperfine 'oha --no-tui http://localhost:3000' 'hey http://localhost:3000'
を実行します
ベンチマーク 1: oha --no-tui http://localhost:3000
時間 (平均 ± σ): 10.8 ms ± 1.8 ms [ユーザー: 5.7 ms、システム: 11.7 ms]
範囲 (最小 … 最大): 8.7 ミリ秒 … 24.8 ミリ秒 (107 回の実行)
ベンチマーク 2: http://localhost:3000
時間 (平均 ± σ): 14.3 ms ± 4.6 ms [ユーザー: 12.2 ms、システム: 19.4 ms]
範囲 (最小 … 最大): 11.1 ミリ秒 … 48.3 ミリ秒 (88 実行)
このベンチマークでは、 oha --no-tui http://localhost:3000
方が高速であることが判明し、 hey http://localhost:3000
よりも約 1.32 ± 0.48 倍高速に実行されます。
oha
rakyll/hey から継承したデフォルト オプションを使用しますが、より現実的な条件でストレス テストを行うにはオプションを変更する必要がある場合があります。
次のオプションを指定してoha
実行することをお勧めします。
oha <-z または -n> -c <同時接続数> -q <秒あたりのクエリ> --latency-correction --disable-keepalive <ターゲット アドレス>
--キープアライブを無効にする
実際には、ユーザーはキープアライブを使用して同じ URL をクエリしません。 Keep-Alive
なしで実行することもできます。
--レイテンシー補正
--latency-correction
使用すると、 Coordinated Omission Problem
回避できます。
--burst-delay
--burst-rate
オプションと一緒に使用すると、定義された数のリクエストの間に遅延を導入できます。
oha -n 10 --バースト遅延 2s --バーストレート 4
この特定のシナリオでは、2 秒ごとに 4 つのリクエストが処理され、6 秒後には合計 10 つのリクエストが処理されます。注: --burst-rate
オプションを設定しない場合、量はデフォルトの 1 になります。
--rand-regex-url
オプションを使用して、接続ごとにランダムな URL を生成できます。
oha --rand-regex-url http://127.0.0.1/[az][az][0-9]
各 URL は rand_regex クレートによって生成されますが、正規表現のドットはこの目的には役に立たず、URL のドットが正規表現のドットとして解釈されると非常に不便であるため、無効になっています。
オプションで--max-repeat
オプションを設定して、各正規表現の最大繰り返し回数を制限できます。たとえば、http://127.0.0.1/[az]* に--max-repeat 4
を指定すると、http://127.0.0.1/[az]{0,4} のような URL が生成されます。
現在、動的スキーム、キープアライブを備えたホストおよびポートはうまく機能しません。
ぜひご協力ください。
改善すべき点がいくつかあります。
テストを書く
tui のデザインを改善します。
さらに詳しい情報を表示しますか?
現在リアルタイムツイには色がありません。色彩感覚のある方の助けが欲しいです。
速度の向上
東京の初心者です。クエリのスケジュールを最適化する余地はあると思います。