uokadaの見逃し三振は嫌いです

ここで述べられていることは私の個人的な意見に基づくものであり、私が所属する組織には一切の関係はありません。

モダンで簡易なHTTP負荷テストツール vegeta

去年書いた記事を投稿してみようと思います。

HTTP(S)負荷テストツールの紹介をしたいと思います。

一般的なHTTP負荷テスト

お手軽にやるなら ab か http_load を使うのが一般的です。 それとも、ちょっと手間をかけて JMeter ですか?

ただ、 ab は1つのURLに対してしか負荷をかけられないし、http_loadはHTTPSのテストがちゃんと出来ない欠点があります。 JMeterはそもそも導入からセットアップまでに時間がかかってあんまりお手軽という感じではないですよね。

そこで今日紹介するのが vegeta です。

what's vegeta

tsenart/vegeta まずはgithubリポジトリをみてみましょう。

READMEにこの画像がある時点でお察しですね。 vegeta

ドラゴンボールベジータから名前をとったツールです。 vegetaはpython界隈で静かなブームの go で書かれています。

how to use

vegeta を使うには2通り方法があります。

  1. githubリポジトリから取得
  2. 自力ビルド

1つめの方法は Mac向けと Linux向けのビルドが用意されているのでそれぞれの環境に合わせたものを取得して使って下さい。詳細は割愛します。 そんなに難しくないのでなるべく自力でビルドしましょう。

how to build

下の手順でビルド出来ます。

$ git clone git@github.com:tsenart/vegeta.git
$ cd vegeta

$ export |grep GO          
GOPATH=/usr/local/Cellar/go/1.1.1/bin
GOROOT=/usr/local/Cellar/go/1.1.1

% go build  -o vegeta   

たったこれだけの手順でビルド出来ます。 go言語だとC/C++みたいにヘッダーファイルが足りないとかはほとんど言われません。

ただし、goのインストールとGOPATHの設定で詰んだらビルド済みのファイルを持ってきましょう。 Goの特徴としてビルドされたファイルは共有オブジェクトへの依存がありませんので一度ビルドしてしまえばビルド済みのファイルはどの環境でも動きます。なので、誰かがビルドしたものが自分の環境でも簡単に動きます。

Usage

vegeta の実行ファイルが用意できたら次はテストするURLのリストファイルを作成します。 書式は次のような感じです。

<METHOD> <URL>
GET http://goku:9090/path/to/dragon?item=balls
GET http://user:password@goku:9090/path/to
HEAD http://goku:9090/path/to/success
# 秒間100リクエストで60秒間負荷をかけます。
$ vegeta attack -rate=100 -duration=60s -targets=targets.txt > results.vr
2013/12/18 23:32:16 Vegeta is attacking 3 targets in random order for 1m0s...
2013/12/18 23:33:16 Done!
2013/12/18 23:33:16 Writing results to 'stdout'...

いまどきのCPUをたくさん積んだサーバーで vegeta を使うときは -cpus オプションを使ってあげると利用するCPUの数が指定出来るので他にプロセスが動いているサーバーで負荷検証する場合などにリソースを食いつぶさないために利用します

# 秒間1000リクエストで60秒間負荷をかけます。
$ vegeta -cpus=3 attack -rate=1000 -duration=60s -targets=targets.txt > results.vr

結果の確認

結果をみるためには3つの方法が用意されてます。

  1. text
  2. json
  3. graph

まず、textで見るには次のようにします。

$ ./vegeta report -input=results.vr      
Requests    [total]         600
Duration    [total]         59.900390483s
Latencies   [mean, 95, 99, max] 537.261629ms, 1.622298507s, 1.742493283s, 1.742493283s
Bytes In    [total, mean]       14680738, 24467.90
Bytes Out   [total, mean]       0, 0.00
Success     [ratio]         100.00%
Status Codes    [code:count]        200:600  
Error Set:

jsonで結果を見るには次のようにします。

$ ./vegeta report -input=results.vr -reporter=json > metrics.json

プロットした形で見るには一旦htmlを作ってからブラウザで確認してあげましょう。 個人的にはpythonのSimpleHTTPServerが手軽で便利です。

$ cat results.vr | ./vegeta report -reporter=plot > plot.html
$ python  -mSimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...

http://localhost:8000/plot.html

パラメータに関する注意

ベンチマークの測定時間を1秒にするような例がありますが一瞬の負荷ならなんとか持ちこたえるサーバーがよくあるのでちゃんと分単位で最低でも30分以上は一定の負荷をかけ続けてベンチマークを取りましょう。

http://qiita.com/morikat/items/271c8b40fe1d6dc7e75c

サーバーのログローテーションなどのcronのタイミングとピークのリクエストが重なることでリクエストが正常に完了しないということがよくあります。 そういった現象を確認するためにもベンチマークを取るときは長めに行うのが鉄則です。

まとめ

というわけど、vegeta の紹介をしてみました。 Goのコードは一度ビルドしてしまえば同じOS・同じCPUの環境にはscpしてあげるだけで動くのでyinstパッケージを入れるよりもずっと手軽です。

2013年はへび年、つまり python の年でしたが 2014年は golang の年になると思います。 みなさんも来年は Go を覚えるとハッピーになれると思います。

基礎からわかる Go言語

基礎からわかる Go言語