796 文字
4 分
Vegetaを使ったサーバの負荷テスト
2019-01-21
2021-10-24

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

Vegetaのインストール#

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

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

Terminal window
$ 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というファイルに書き出しています。

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

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

Terminal window
$ 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形式でも出力可能です。

Terminal window
$ 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を書いたファイルを用意します。

Terminal window
$ 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へアクセスする負荷テストを行うことができます。

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

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

Terminal window
$ 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でなくても問題ありません。

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

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

Terminal window
$ 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リクエストの負荷テストを実現できます。

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

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

Terminal window
$ 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" "-"
...