仕事でサーバの負荷テストをすることになったので、Vegetaという負荷ツールを使ってみようと思いました。githubの画像がとても素敵ですね。
Vegetaのインストール
まずはVegetaをインストールします。インストールにはGo言語の開発環境が必要なので、環境を作ってない人はこちらを参考に構築してください。
VegetaはGo言語製のツールなので、go get
コマンドでインストールします。
$ go get -u github.com/tsenart/vegeta
Vegetaの使い方
負荷テストは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.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" "-" ...
コメント