こんにちは、ちゃりおです。
Vegetaを使って負荷テストをやってみました。
Vegetaの使い方と目標負荷の計算方法について書きます。
Vegetaとは
Golang製の負荷テストツールです。
シンプルに使えて、グラフの出力などもできます。
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実行
以下の情報があれば、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は事前に計算して実施したいです。
負荷の考え方に関しては、以下の本が参考になりました。