Golang製HTTP負荷テストツールVegetaを使ってみた。

負荷試験をすることになったので、jMeterやApache Benchではなくて、Vegetaを使ってみた。

Vegeta とは

Golang製のHTTP load testing tool。

READMEのVegetaに惚れたw

Vegeta

install

Mac OS Xならbrewで一発。

$ brew install vegeta

その他の場合はGoのコマンドで。

$ go get github.com/tsenart/vegeta
$ go install github.com/tsenart/vegeta

使い方

シナリオを用意

<Method> <URL>というようにアクセスするURLを順番に記述していくだけでOK。

例えばこんな感じ。

GET http://localhost:7826
GET http://localhost:7826/archive
GET http://localhost:7826/2015/02/26/fdr-ax30

Attack!!!

くらえ!!こいつが超ベジータのビッグ・バン・アタックだ!!!

実際にリクエストを投げるときはvegeta attackコマンドを使う。

-rate=100で秒間100リクエスト、-duration=10sでそれを10秒間ということ。

$ vegeta attack -rate=100 -duration=10s -targets=targets.txt > results.txt

Report

実行結果の確認はvageta reportコマンドで。

-reporterで出力方法を選ぶことが出来る。

text

一番基本的なテキスト。-reporterを指定しない場合もこれ。

$ vegeta report -inputs=results.txt -reporter=text
Requests    [total, rate]            1000, 100.10
Duration    [total, attack, wait]        9.992317035s, 9.989999919s, 2.317116ms
Latencies    [mean, 50, 95, 99, max]        3.743189ms, 3.344156ms, 5.421547ms, 58.951463ms, 58.951463ms
Bytes In    [total, mean]            38100431, 38100.43
Bytes Out    [total, mean]            0, 0.00
Success        [ratio]                100.00%
Status Codes    [code:count]            200:1000  
Error Set:

json

jsonでの出力。jqと一緒に使うと見やすい。

$ vegeta report -inputs=results.txt -reporter=json | jq .
{
  "latencies": {
    "mean": 3743189,
    "50th": 3344156,
    "95th": 5421547,
    "99th": 58951463,
    "max": 58951463
  },
  "bytes_in": {
    "total": 38100431,
    "mean": 38100.431
  },
  "bytes_out": {
    "total": 0,
    "mean": 0
  },
  "duration": 9989999919,
  "wait": 2317116,
  "requests": 1000,
  "rate": 100.10010091172254,
  "success": 1,
  "status_codes": {
    "200": 1000
  },
  "errors": []
}

plot

canvasを使ったグラフでの出力。ブラウザで開くとPNG画像もダウンロード出来る。

$ vegeta report -inputs=results.txt -reporter=plot > plot.html

Plot

まとめ

残念ながらjMeterほど高機能では無い。

けれども、シンプルな実行方法だったりグラフが出力出来たり、リッチな部分もあるので、なかなか使いやすいと思う。

Golang