しゃのんあどべんとかれんだー 22 日目 (vegeta 様が負荷テストを行ってくれる?) 匿名 匿名 この記事は、しゃのんあどべんとかれんだー 22 日目の記事です。 ![Gopher](http://3.bp.blogspot.com/-BkZc1CxpTog/Vop01JWPgGI/AAAAAAAAAW4/VzN1LSgOHak/s200/go-gopher2.png) どうも、munepom (`@__munepom__`) です。 今回は、Go で書かれた HTTP 負荷ツールを試してみたおはなしです。 # Go 製 HTTP 負荷テストツール vegeta いつぞやの記事で、負荷テストツールの Gatling について書きましたが、 もう少し手軽に使えるものも触っておきたいなー、ということで、何かないかと探してみました。 最近、趣味で Go スクリプトを書くこともあるので、Go 縛りで探してみると... vegeta (ベジータ) という名のツールが見つかりました。 https://github.com/tsenart/vegeta ...著作権的に、画像は載せられなさげですねw (Go 製 HTTP 負荷テストツールは、他には Boom があるようですね。 https://github.com/rakyll/boom ) # vegeta インストール方法 前提条件は、以下の 2 つです。 - [Go](https://golang.org/dl/) がインストールされていること。 - GOPATH が環境変数に設定されていること。 あとは、github のページにあるように、 ``` $ go get github.com/tsenart/vegeta $ go install github.com/tsenart/vegeta ``` でインストールできます。 # vegeta 様を使ってみました では、使ってみましょう。 簡単なやり方としては、どのようなメソッドで、ターゲットとする URL に対してアクセスするか?というシナリオをテキストファイルに記述して、それを vegeta コマンドが読み取って実行する方法ですね。 targets.txt に ``` GET http://localhost/ ``` のように記述しておき、 ``` vegeta attack -rate=100 -duration=60s -targets=targets.txt > results.bin ``` で実行できます。 上で実行した際のオプションは、ざっと下記のような意味があります。 - rate: 秒間 n リクエスト実行 - duration: 実行時間 - targets: シナリオを記述したファイル # 結果を確認してみる results.bin はバイナリファイルですので、vegeta report コマンドで結果を確認しましょう。 以下の 3 種類のフォーマットで確認してみました。 1. テキスト形式 2. JSON 形式 3. Latency (ms) のグラフ形式 ##### テキスト形式の結果一例 ``` $ vegeta report -inputs=results.bin -reporter=json Requests [total, rate] 6000, 100.02 Duration [total, attack, wait] 1m9.638870377s, 59.989999799s, 9.648870578s Latencies [mean, 50, 95, 99, max] 2.098975165s, 3.03968ms, 7.587728012s, 15.002821969s, 30.009745499s Bytes In [total, mean] 0, 0.00 Bytes Out [total, mean] 0, 0.00 Success [ratio] 0.00% Status Codes [code:count] 0:6000 Error Set: Get http://localhost/: dial tcp 0.0.0.0:0->127.0.0.1:80: getsockopt: connection refused Get http://localhost/: dial tcp: lookup localhost: no such host Get http://localhost/: dial tcp 0.0.0.0:0->127.0.0.1:80: i/o timeout ``` ##### JSON 形式の結果一例 そのままだと確認しづらいので、JSON を見やすくするツール (jq など) を利用すると良いでしょう。 ``` $ vegeta report -inputs=results.bin -reporter=json {"latencies":{"total":12593850990577,"mean":2098975165,"50th":3039680,"95th":7587728012,"99th":15002821969,"max":30009745499},"bytes_in":{"total":0,"mean":0},"bytes_out":{"total":0,"mean":0},"earliest":"2015-12-31T23:09:21.176247813+09:00","latest":"2015-12-31T23:10:21.166247612+09:00","end":"2015-12-31T23:10:30.81511819+09:00","duration":59989999799,"wait":9648870578,"requests":6000,"rate":100.01666978001917,"success":0,"status_codes":{"0":6000},"errors":["Get http://localhost/: dial tcp 0.0.0.0:0-\u003e127.0.0.1:80: getsockopt: connection refused","Get http://localhost/: dial tcp: lookup localhost: no such host","Get http://localhost/: dial tcp 0.0.0.0:0-\u003e127.0.0.1:80: i/o timeout"]} ``` ##### グラフ出力の結果一例 reporter=plot でグラフを出力できますので、適当なサーバを立てれば、すぐに確認できます。(python の SimpleHTTPServer がオススメです) ``` $ vegeta report -inputs=results.bin -reporter=plot > plot.html $ python -m SimpleHTTPServer 8000 ``` ![vegeta グラフ](http://3.bp.blogspot.com/-6TkiVkhIQXo/VoU4wJfF2TI/AAAAAAAAATE/71cpoB8CeZk/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2015-12-31%2B23.16.06.png) 今回は、vegeta attack 時に全てエラーとなるようにしていましたので、真っ赤なグラフですがw グラフは、Gatling の方が圧倒的に見やすいと思います。 ビッグバンアタックをくらってもやられないシステムを目指して(?) レッツ Enjoy! (・ω・)ノ Tweet Share Share Share Share