CLOVER🍀

That was when it all began.

負荷テストツヌルVegetaを詊す

これは、なにをしたくお曞いたもの

Vegetaずいう、割ず個性的な負荷テストツヌルがあり、コマンドラむンで簡単に䜿えそうなので詊しおみようかずいうこずで。

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

Apache Benchの代わりに䜿えたらどうでしょうくらいの感芚で、芋おみたした。

Vegeta

Vegetaずいうのは、HTTPの負荷テストツヌルです。

Vegeta is a versatile HTTP load testing tool built out of a need to drill HTTP services with a constant request rate.

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

名前がたさしく ですが、リポゞトリに茉せられおいる画像もそのたんたですね。

https://camo.githubusercontent.com/417a39e5a142e0877be0a7a6d7a66cb77ea21e8c/687474703a2f2f666330392e64657669616e746172742e6e65742f667334392f692f323030392f3139382f632f632f73736a325f7665676574615f62795f7472756e6b7332342e6a7067

Go蚀語で䜜成されおおり、CLIずしおも䜿えたすし、ラむブラリずしおも利甚するこずができたす。

It can be used both as a command line utility and a library.

レポヌトは、テキスト、JSON、ヒストグラムやグラフで芋れたりするようです。

report command

テスト察象は、デフォルトは暙準入力で䞎えるようですが、ファむルで甚意しお耇数のタヌゲットに察しお負荷をかけるこずも
できるようです。

format

分散実行は盎接はサポヌトしおいなさそうですが、SSHを䜿っお耇数のサヌバヌでVegetaを実行し、結果のレポヌトを
統合するこずで分散実行を実珟するようです。

Distributed attacks

途䞭経過をリアルタむムに芋るためには、他のツヌルの助けが必芁な暡様。

Real-time Analysis

ずたあ、前眮きはこれくらいにしお、実際に䜿っおみたしょう。

環境

環境は、Ubuntu Linux 18.04 LTSで行いたした。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.2 LTS
Release:    18.04
Codename:   bionic

むンストヌル

CLIずしおは、バむナリをダりンロヌドしおきお展開すれば䜿うこずができたす。

$ wget https://github.com/tsenart/vegeta/releases/download/cli%2Fv12.3.0/vegeta-12.3.0-linux-amd64.tar.gz
$ tar xf vegeta-12.3.0-linux-amd64.tar.gz

バヌゞョン、12.3.0 。

$ ./vegeta -version
Version: 12.3.0
Commit: 7bf09f4fab4d852141935796455c17459d212098
Runtime: go1.12 linux/amd64
Date: 2019-04-14T13:29:49Z"

䜿い方は、ヘルプを芋るずよいでしょう。

$ ./vegeta -h

最埌の方に、コマンドの実行䟋が出力されたす。

  echo "GET http://localhost/" | vegeta attack -duration=5s | tee results.bin | vegeta report
  vegeta report -type=json results.bin > metrics.json
  cat results.bin | vegeta plot > plot.html
  cat results.bin | vegeta report -type="hist[0,100ms,200ms,300ms]"

あずは、マニュアルを芋ながらオプションの意味を確認し぀぀ ですね。

manual

テスト察象サヌバヌ

Vegetaは負荷テストツヌルなので、負荷をかける察象がいないず始たりたせん。

ここは、簡単にNode.jsExpressで甚意したした。

$ node -v
v10.15.3


$ npm init
$ npm i express

利甚したExpressのバヌゞョンは、こちら。

  "dependencies": {
    "express": "^4.16.4"
  },

䜜成したアプリケヌション。3぀、゚ンドポむントを䜜成したした。
※GET、POSTのパスに冗長感ありたすが、今回は明確にパスを分けたした
server.js

const express = require('express');
const app = express();
const bodyParser = require('body-parser');

app.use(bodyParser.urlencoded({ extended: true }));


app.get('/', (req, res) => res.send('Hello!!'));

app.get('/echo/get', (req, res) => res.send(req.query.message));

app.post('/echo/post', (req, res) => res.send(req.body.message));


app.listen(3000, () => console.log(`[${new Date()}] Server startup`));

package.jsonのscriptsに登録しお

  "scripts": {
    "start": "node server.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },

起動。

$ npm start

> target-server@1.0.0 start /path/to/target-server
> node server.js

[Sun Apr 28 2019 21:05:04 GMT+0900 (GMT+09:00)] Server startup

確認。

$ curl localhost:3000
Hello!!

$ curl localhost:3000/echo/get?message=hello
hello

$ curl -XPOST -H 'Content-Type: application/x-www-form-urlencoded' localhost:3000/echo/post -d 'message=hello'
hello

これで、準備完了です。

単䞀のURLに察しお負荷をかけおみる

それでは、Vegetaを䜿っお察象のサヌバヌに負荷をかけおみたしょう。

以䞋のコマンドで、「http://localhost:3000」にHTTP GETで、5秒間負荷をかけお結果を衚瀺したす。レポヌトはデフォルトで
暙準出力に出力されるので、それをさらに「vegeta report」で敎圢したす。

$ echo 'GET http://localhost:3000' | ./vegeta attack -duration=5s | ./vegeta report

結果。

Requests      [total, rate]            250, 50.20
Duration      [total, attack, wait]    4.981730015s, 4.980160389s, 1.569626ms
Latencies     [mean, 50, 95, 99, max]  1.096255ms, 1.092932ms, 1.595155ms, 2.017918ms, 3.177145ms
Bytes In      [total, mean]            1750, 7.00
Bytes Out     [total, mean]            0, 0.00
Success       [ratio]                  100.00%
Status Codes  [code:count]             200:250  
Error Set:

結果の読み方は、レポヌトのフォヌマットが「text」のずころに曞いおありたす。

report -type=text

  • Requests
    • total 
 党実行回数
    • rate 
 秒間の実行回数
  • Duration
    • total 
 負荷をかけるのに芁した時間attackwait
    • attack 
 党リク゚ストを実行するのに芁した時間total - wait
    • wait 
 レスポンスを埅っおいる時間
  • Latencies 
 それぞれ、平均、50、95、99パヌセンタむル、最倧倀
  • Bytes InBytes Out 
 リク゚ストレスポンスの送受信のバむト数
  • Success 
 リク゚ストの成功率なお、200ず400が゚ラヌずしおカりントされない
  • Status Codes 
 ステヌタスコヌドのヒストグラム0は、倱敗
  • Error Set 
 倱敗したリク゚ストずその内容

最初の䟋が、秒間50リク゚ストずなかなか激しいので、ちょっず䞋げおみたしょう。「-rate」で指定するこずができたす。
秒あたり、3にしおみたしょう。

$ echo 'GET http://localhost:3000' | ./vegeta attack -duration=5s -rate=3 | ./vegeta report
Requests      [total, rate]            15, 3.21
Duration      [total, attack, wait]    4.668077623s, 4.666875044s, 1.202579ms
Latencies     [mean, 50, 95, 99, max]  1.061737ms, 935.134µs, 2.220665ms, 2.486884ms, 2.486884ms
Bytes In      [total, mean]            105, 7.00
Bytes Out     [total, mean]            0, 0.00
Success       [ratio]                  100.00%
Status Codes  [code:count]             200:15  
Error Set:

゚ラヌの堎合も芋おみたしょう。詊しに、Not FoundになるURLで詊しおみたす。

$ echo 'GET http://localhost:3000/notfound' | ./vegeta attack -duration=5s -rate=3 | ./vegeta report
Requests      [total, rate]            15, 3.21
Duration      [total, attack, wait]    4.667400657s, 4.666715559s, 685.098µs
Latencies     [mean, 50, 95, 99, max]  1.38848ms, 963.456µs, 4.354423ms, 4.627119ms, 4.627119ms
Bytes In      [total, mean]            2205, 147.00
Bytes Out     [total, mean]            0, 0.00
Success       [ratio]                  0.00%
Status Codes  [code:count]             404:15  
Error Set:
404 Not Found

次は、POSTしおみたしょう。

HTTPボディの内容は、以䞋のようなテキストファむルを甚意。
body.txt

message=test

URLの前に、今床は「POST」を指定しお負荷を曞けたす。䜜成したHTTPボディ甚のテキストファむルは、「-body」オプションで
指定したす。あず、「-header」でHTTPヘッダヌも远加したした。

$ echo 'POST http://localhost:3000/echo/post' | ./vegeta attack -duration=5s -body=body.txt -header='Content-Type: application/x-www-form-urlencoded' | ./vegeta report

結果。

Requests      [total, rate]            250, 50.20
Duration      [total, attack, wait]    4.981419329s, 4.980088019s, 1.33131ms
Latencies     [mean, 50, 95, 99, max]  1.399184ms, 1.358172ms, 1.962928ms, 3.146063ms, 5.236047ms
Bytes In      [total, mean]            1250, 5.00
Bytes Out     [total, mean]            3250, 13.00
Success       [ratio]                  100.00%
Status Codes  [code:count]             200:250  
Error Set:

「-body」オプションはあくたでファむルを指定するので、ファむルを甚意するのは面倒ず思うかもしれたせん。

そういう時は、JSONフォヌマットを䜿うずよいかもしれたせん。こうするず、HTTPボディやヘッダヌの内容を

$ jq -ncM '{method: "POST", url: "http://localhost:3000/echo/post", body: "message=test" | @base64, header: {"Content-Type": ["application/x-www-form-urlencoded"]}}' | ./vegeta attack -format=json -duration=5s | ./vegeta report

結果。

Requests      [total, rate]            250, 50.20
Duration      [total, attack, wait]    4.981231371s, 4.980126573s, 1.104798ms
Latencies     [mean, 50, 95, 99, max]  1.328564ms, 1.192952ms, 1.933122ms, 2.922471ms, 23.264626ms
Bytes In      [total, mean]            1000, 4.00
Bytes Out     [total, mean]            3000, 12.00
Success       [ratio]                  100.00%
Status Codes  [code:count]             200:250  
Error Set:

結果をグラフで芋る

ここたでテキスト圢匏で結果を芋おきたしたが、「vegeta plot」を䜿うこずでグラフ圢匏でも芋るこずができたす。

$ echo 'GET http://localhost:3000' | ./vegeta attack -duration=5s | ./vegeta plot > report.html

結果のHTMLを衚瀺するず、こんな感じになりたす。

f:id:Kazuhira:20190428214103p:plain

この䟋では5秒間負荷をかけおいたすが、その掚移をグラフ衚瀺した感じですね。

Requests      [total, rate]            250, 50.20
Duration      [total, attack, wait]    4.981240384s, 4.980150818s, 1.089566ms
Latencies     [mean, 50, 95, 99, max]  942.97µs, 880.2µs, 1.525036ms, 2.03296ms, 2.314226ms
Bytes In      [total, mean]            1750, 7.00
Bytes Out     [total, mean]            0, 0.00
Success       [ratio]                  100.00%
Status Codes  [code:count]             200:250  
Error Set:

耇数のURLぞ負荷をかける

耇数のURLに察しお負荷をかける堎合は、以䞋のフォヌマットに埓っお察象のURLを列挙したす。

http format

test-scenario.txt

GET http://localhost:3000

GET http://localhost:3000/echo/get?message=test

POST http://localhost:3000/echo/post
Content-Type: application/x-www-form-urlencoded
@body.txt

HTTPヘッダも指定するこずができ、HTTPボディはファむルで指定したす。

このファむルを、「-targets」オプションで指定したす。

$ ./vegeta attack -targets=test-scenario.txt -duration=5s | ./vegeta report

結果。

Requests      [total, rate]            250, 50.20
Duration      [total, attack, wait]    4.980628214s, 4.980055554s, 572.66µs
Latencies     [mean, 50, 95, 99, max]  1.208511ms, 1.067828ms, 1.793813ms, 2.42757ms, 16.116178ms
Bytes In      [total, mean]            1335, 5.34
Bytes Out     [total, mean]            1079, 4.32
Success       [ratio]                  100.00%
Status Codes  [code:count]             200:250  
Error Set:

 個別のURLに察する結果はわからない感じ

結果をグラフにしおみたしょう。

$ ./vegeta attack -targets=test-scenario.txt -duration=5s | ./vegeta plot > report.html

こちらでも、わからないようで 。

f:id:Kazuhira:20190428215049p:plain

たあ、おおたかな䜿い方はわかったので、良しずしたしょう。

もうちょっず凝りたい堎合は、Apache JMeterやLocustを䜿うのが良いのでしょうね。