ISheep

ISheep

Badminton | Coding | Writing | INTJ
github

vegetaの負荷テスト使用

vegeta は、Go で書かれた HTTP 負荷テストツールで、コマンドラインインタラクションを使用し、結果の分析として集計とグラフの生成ができます。

基本的な使用方法#

詳細な使用方法は、README の内容を参照してください。2 つの方法で使用することができます:コマンドラインインタラクションと Go プログラムにライブラリとして組み込む方法です。私は brew を使用して vegeta をインストールしましたが、テストプロセス全体はテストを実行するために Go でスクリプトを作成することで行いました。詳細については、コードスニペットを参照してください。

ライブラリの形式ではなく、exec.Command()関数を使用してコマンドラインを実行しました。

使用した vegeta コマンドの詳細

  1. attack: API を呼び出すコマンドです。rate は 1 秒あたりの呼び出し回数を表し、duration は呼び出す秒数を表します。body は POST リクエストのリクエストボディを指定し、name はテストに名前を付けます(省略可能)、tee は bin 形式の生データファイルを生成し、report はレポートを生成し、ここではコマンドラインに出力します。
echo "POST http://172.17.1.36:30898/hello" | vegeta attack -rate=2000 -duration=1s -body=query.json -timeout=0 -name=hello | tee ./result/results-null.bin | vegeta report
  1. レポートファイルを生成します。ここでは、bin 形式の生データファイルから txt ファイルを生成します。
vegeta report -type=text results-query.bin > repost.txt
  1. 分析グラフを生成します。plot を使用すると、対話型のグラフが生成されます。複数の結果を 1 つのグラフにマージする場合は、最初のコマンドで必ず - name パラメータを使用する必要があります。
vegeta plot results-null.bin results-sleep.bin results-query.bin > plot-all.html

image

テストシナリオ#

Java と Go で 2 つの REST サービスを作成し、それぞれ 3 つの API をテストします。Kubernetes 上で単一のレプリカと 5 つのレプリカの場合にテストします。API の詳細は以下の通りです:

  1. 直接返す
  2. 2 秒待ってから返す
  3. Elasticsearch の 10000 件のデータをクエリし、各データは 500 バイトです

Elasticsearch クラスタの情報

  • ノード数:2
  • バージョン:7.4.1
  • CPU:8 つの Intel (R) Xeon (R) Silver 4114 CPU @ 2.20GHz、各 1 コア
  • メモリ:31G

Kubernetes の情報

  • バージョン:1.16.15
  • ノード数:7(1 つのマスター、6 つのワーカー)

Deployment を同じノードにスケジュールするように指定し、2 つの Deployment にはそれぞれ 2G のメモリが割り当てられています。

テスト手順#

Go スクリプトをパッケージ化し、同じディレクトリにconfig.iniという設定ファイルを作成します。

[address]
null = "POST http://172.17.1.36:30898/hello"
sleep = "POST http://172.17.1.36:30898/sleep"
query = "POST http://172.17.1.36:30898/es"
[param]
rate = 2000

address は呼び出す API のアドレスとメソッドを指定し、rate は 1 秒あたりの呼び出し回数を指定します(ここでは 1 秒だけ呼び出しました)。

スクリプトを実行し、待ちます......

image

テスト結果#

各 API ごとに 3 つのファイルが生成されます

  1. results-*.bin ファイル:テストの生データファイル
  2. report-*.txt ファイル:レポートファイル
  3. plot-*.html ファイル:個々の結果のグラフファイル

まずは Java から

  1. 空の API
Requests      [total, rate, throughput]         2000, 2004.21, 1996.25
Duration      [total, attack, wait]             1.002s, 997.9ms, 3.98ms
Latencies     [min, mean, 50, 90, 95, 99, max]  2.114ms, 28.492ms, 11.283ms, 77.584ms, 90.305ms, 111.482ms, 150.836ms
Bytes In      [total, mean]                     10000, 5.00
Bytes Out     [total, mean]                     0, 0.00
Success       [ratio]                           100.00%
Status Codes  [code:count]                      200:2000

フィールドの説明
Requests(リクエスト数):

  • total は総リクエスト数を示し、ここでは 2000 です。
  • rate は 1 秒あたりのリクエスト数を示し、ここでは 2004.21 です。
  • throughput は 1 秒あたりの成功したリクエスト数を示し、ここでは 1996.25 です。

Duration(所要時間):

  • total はテストの総時間を示し、ここでは 1.002 秒です。
  • attack は攻撃時間であり、実際にリクエストを送信する時間です。ここでは 997.9 ミリ秒です。
  • wait は攻撃中にすべてのリクエストの合計待機時間を示します。ここでは 3.98 ミリ秒です。

Latencies(レイテンシ):

  • min は最小レスポンスタイムを示します
  • mean は平均レスポンスタイムを示します
  • 50、90、95、99 はパーセンタイルを示します。それぞれ 50%、90%、95%、99%のレスポンスタイムです。
  • max は最大レスポンスタイムを示します

Bytes In(受信バイト数):

  • total はすべてのリクエストの総受信バイト数を示します
  • mean は 1 つのリクエストの平均受信バイト数を示します

Bytes Out(送信バイト数):

  • total はすべてのリクエストの総送信バイト数を示します
  • mean は 1 つのリクエストの平均送信バイト数を示します

Success(成功率):

  • ratio は成功したリクエストの総リクエスト数に対する割合を示します

Status Codes(ステータスコード):

  • codeは各ステータスコードの出現回数を示します。

3 つの結果を 1 つにマージすると、レスポンスタイムはほぼ線形に増加し、クエリの時間は最後に 3 分以上になります。

vegeta-plot (1)

  1. Go

sleep と空の API は非常に安定しており、クエリのレスポンスタイムも Java よりもはるかに改善されています。

vegeta-plot (2)

次に、5 つのレプリカを追加した場合の結果です。

  1. Java

sleep の安定性が向上し、線形増加しなくなりましたが、クエリのレスポンスタイムはまだかなり高いです。

vegeta-plot (4)

  1. Go

クエリのレスポンスタイムはあまり改善されませんでした。

vegeta-plot (3)

結論#

クエリの API に関しては、ボトルネックは Elasticsearch 側にある可能性がありますので、ここではテストしません。

グラフから見ると、Go の並行処理能力は確かに優れています。

vegeta はまだまだ使い方がたくさんありますが、Jmeter に比べてコマンドラインはあまり使いやすくありませんが、生成される結果は非常に直感的です。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。