インフラ

Vegetaで始める負荷テスト 使い方と目標負荷の求め方

こんにちは、ちゃりおです。

Vegetaを使って負荷テストをやってみました。

Vegetaの使い方と目標負荷の計算方法について書きます。

Vegetaとは

Golang製の負荷テストツールです。
シンプルに使えて、グラフの出力などもできます。

github vegeta

Vegeta使い方

インストール

MACだったらbrewでインストールできます。

$ brew update && brew install vegeta

ソースから

$ go get -u github.com/tsenart/vegeta

負荷をかける vegeta attack

$ echo "GET " | vegeta attack -rate=3 -duration=60s | tee result.bin

vegetaの検証用にちょうどいいサーバがない場合は、dockerでapacheをたてるのがお手軽です。

$ docker pull httpd
$ docker run -d -p 8080:80 httpd
$ % curl localhost:8080
It works!
$ echo "GET http://localhost:8080" | vegeta attack -rate=3 -duration=60s | tee result.bin

テストの結果の確認 vegeta report

$ vegeta report -type=text result.bin
Requests [total, rate, throughput] 180, 3.02, 3.02
Duration [total, attack, wait] 59.668s, 59.663s, 4.728ms
Latencies [min, mean, 50, 90, 95, 99, max] 2.132ms, 4.148ms, 3.651ms, 5.913ms, 7.767ms, 10.008ms, 18.758ms
Bytes In [total, mean] 8100, 45.00
Bytes Out [total, mean] 0, 0.00
Success [ratio] 100.00%
Status Codes [code:count] 200:180
Error Set:

成功率やレイテンシーなど見れます。
MAXやMINだけではなく、90%ileや95%ileが見れるのが嬉しいですね。

グラフ化して出力 vegeta plot

$ cat result.bin | vegeta plot > result_plot.html

こんな感じで出力されます。

vegeta

負荷試験のための目標負荷の計算とvegeta実行

以下の情報があれば、1秒あたりのリクエスト数(rps)が求められます。

  • 1日の利用者数
  • 1人あたりの一日の平均アクセス数
  • 1日の平均アクセス数に対する最大ピーク時の倍率

「vegeta attack」の「-rate」オプションは、1秒あたりのリクエスト数なので求めたrpsで負荷をかければ良いと思います。

負荷をかける時間が短すぎると、実際の結果と乖離するのでシステムのピーク負荷がどれくらい続くか把握できているといいですね。
(最低でも30分はかけたほうがいいと思います。)

最大ピーク時は2~3倍になることが多いので、把握できない場合は3倍とかにしておいてもいいかもしれません。
レイテンシーの目標も予め決めておくと良いです。

例)

  • 1日の利用者数: 10,000UU
  • 1人あたりの一日の平均アクセス数: 5回
  • 1日の平均アクセス数に対する最大ピーク時の倍率: 3倍
  • 安全係数: 3倍
  • ピーク時間: 30分

1日の総アクセス数: 50,000 = 10,000(1日の利用者数) × 5PV(一人あたりの平均アクセス数)
1日の平均rps(回/秒) 0.57 = 50,000 / 86,400

最大rps(回/秒) 5.13 = 0.57(1日の平均rps) × 3(ピーク時の倍率) × 3(安全係数)

例だとvegetaを下記のように実行します。


$ echo "GET " | vegeta attack -rate=5 -duration=1800s | tee result.bin

まとめ

今回は、vegetaで行う負荷試験について書きました。
シンプルで使いやすくて、おすすめのツールです。

目標のない負荷テストは無駄になるので、必要なrpsは事前に計算して実施したいです。
負荷の考え方に関しては、以下の本が参考になりました。

linuxコマンド繰り返し
【Linux】コマンドを繰り返し実行する方法こんにちは、ちゃりおです。 コマンドを繰り返し実行したいことってたまにあると思います。 DNSの設定変更して、digで切り替わっている...
インフラのテストで 使えるコマンド
インフラの結合テスト・負荷テストの時に使えるコマンド(CPU、メモリ、ディスク)サーバの結合テスト・負荷テストをたまに作ることがあります。 新人の頃は、何を作ればよいのか分からない状態でした。 最近作れるようにな...
[ServerSpec入門]Ansilbeで構築したサーバをServerspecで自動テストするServerspecに入門してみました。 Serverspceを使用することで、インフラのテストが自動化できます。 単体テストと呼ばれる...