Vegetaを使ったサーバの負荷テスト

仕事でサーバの負荷テストをすることになったので、Vegetaという負荷ツールを使ってみようと思いました。githubの画像がとても素敵ですね。

GitHub - tsenart/vegeta: HTTP load testing tool and library. It's over 9000!
HTTP load testing tool and library. It's over 9000! - tsenart/vegeta

Vegetaのインストール

まずはVegetaをインストールします。インストールにはGo言語の開発環境が必要なので、環境を作ってない人はこちらを参考に構築してください。

VegetaはGo言語製のツールなので、go getコマンドでインストールします。

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

Vegetaの使い方

負荷テストはvegeta attackというコマンドを使用します。このコマンド名個人的に大好きです。

GETリクエストで1つのURLへの負荷テスト

1つの特定のURLへのGETリクエストでのサーバの負荷テストはこうやります。duration=5srate=10は、5秒間の間、10 req/secで指定したURLにアクセスすることを示しています。

結果はresult.binというファイルに書き出しています。

$ echo "GET http://192.168.3.2:8080" | vegeta attack -duration=5s -rate=10 > result.bin

サーバのアクセス履歴を見ると、ちゃんとアクセスが来ていることがわかります。なお、サーバにはNginxを使っています。

$ sudo tail /var/log/nginx/access.log
10.0.2.2 - - [20/Jan/2019:21:13:39 +0900] "GET / HTTP/1.1" 200 612 "-" "Go-http-client/1.1" "-"
10.0.2.2 - - [20/Jan/2019:21:13:39 +0900] "GET / HTTP/1.1" 200 612 "-" "Go-http-client/1.1" "-"
...

結果は下記のように見ます。なお、-type=jsonオプションを付与することで、JSON形式でも出力可能です。

$ cat result.bin | vegeta report
Requests      [total, rate]            50, 10.20
Duration      [total, attack, wait]    4.9028774s, 4.9006794s, 2.198ms
Latencies     [mean, 50, 95, 99, max]  2.07302ms, 2.0215ms, 2.919ms, 3.765ms, 3.765ms
Bytes In      [total, mean]            30600, 612.00
Bytes Out     [total, mean]            0, 0.00
Success       [ratio]                  100.00%
Status Codes  [code:count]             200:50
Error Set:

複数のURLへの負荷テスト

複数のURLへのアクセスで負荷テストをする場合は、まずアクセスしたいURLを書いたファイルを用意します。

$ cat request_url.txt
GET http://192.168.3.2:8080
GET http://192.168.3.2:8080/hoge
GET http://192.168.3.2:8080/fuga

-targetsオプションにこのファイルを指定してやることで、複数のURLへアクセスする負荷テストを行うことができます。

$ vegeta attack -duration=5s -rate=10 -targets=request_url.txt > result.bin

アクセスログを確認すると、ちゃんと指定した3つのURLへ均等にアクセスできていることを確認できます。

$ sudo tail /var/log/nginx/access.log
...
10.0.2.2 - - [21/Jan/2019:01:54:25 +0900] "GET / HTTP/1.1" 200 612 "-" "Go-http-client/1.1" "-"10.0.2.2 - - [21/Jan/2019:01:54:25 +0900] "GET /hoge HTTP/1.1" 200 8 "-" "Go-http-client/1.1" "-"10.0.2.2 - - [21/Jan/2019:01:54:25 +0900] "GET /fuga HTTP/1.1" 200 11 "-" "Go-http-client/1.1" "-"
...

POSTリクエストでの負荷テスト

POSTリクエストを用いる場合も-targetsオプションを使用します。まずは送りたいbodyを書いたファイルを用意します。JSONファイルを使った例を用いたサイトが多いようですが、別にJSONでなくても問題ありません。

$ cat parameter.txt
hoge=1&fuga=2&piyo=3

さらに、URL、必要ならheader、bodyを書いたファイルを用意します。なお、bodyを書いたファイルパスを指定する場合は先頭に@を付与します。

$ cat request_url.txt
POST http://192.168.3.2:8080/piyo
Content-Type: application/x-www-form-urlencoded
@parameter.txt

これで、-targetsオプションにURLやbodyを記したファイルを指定することで、POSTリクエストの負荷テストを実現できます。

$ vegeta attack -duration=5s -rate=10 -targets=request_url.txt > result.bin

ログでもちゃんとPOST判定されてます。

$ sudo tail /var/log/nginx/access.log
...
10.0.2.2 - - [21/Jan/2019:01:47:47 +0900] "POST /piyo HTTP/1.1" 200 86 "-" "Go-http-client/1.1" "-"10.0.2.2 - - [21/Jan/2019:01:47:47 +0900] "POST /piyo HTTP/1.1" 200 86 "-" "Go-http-client/1.1" "-"
...

コメント