仕事でサーバの負荷テストをすることになったので、Vegetaという負荷ツールを使ってみようと思いました。githubの画像がとても素敵ですね。
Vegetaのインストール
まずはVegetaをインストールします。インストールにはGo言語の開発環境が必要なので、環境を作ってない人はこちらを参考に構築してください。
VegetaはGo言語製のツールなので、go getコマンドでインストールします。
$ go get -u github.com/tsenart/vegetaVegetaの使い方
負荷テストはvegeta attackというコマンドを使用します。このコマンド名個人的に大好きです。
GETリクエストで1つのURLへの負荷テスト
1つの特定のURLへのGETリクエストでのサーバの負荷テストはこうやります。duration=5s、rate=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.log10.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 reportRequests [total, rate] 50, 10.20Duration [total, attack, wait] 4.9028774s, 4.9006794s, 2.198msLatencies [mean, 50, 95, 99, max] 2.07302ms, 2.0215ms, 2.919ms, 3.765ms, 3.765msBytes In [total, mean] 30600, 612.00Bytes Out [total, mean] 0, 0.00Success [ratio] 100.00%Status Codes [code:count] 200:50Error Set:複数のURLへの負荷テスト
複数のURLへのアクセスで負荷テストをする場合は、まずアクセスしたいURLを書いたファイルを用意します。
$ cat request_url.txtGET http://192.168.3.2:8080GET http://192.168.3.2:8080/hogeGET 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.txthoge=1&fuga=2&piyo=3さらに、URL、必要ならheader、bodyを書いたファイルを用意します。なお、bodyを書いたファイルパスを指定する場合は先頭に@を付与します。
$ cat request_url.txtPOST http://192.168.3.2:8080/piyoContent-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" "-"...