Webサイトの負荷検証ツールを作ってみた
先週仕事で、負荷検証をしてみたいかも!みたいな話がすこし上がって、どんなツールがあるのか調べてみたら、最近は Gatling というのがちょっとアツいらしい。 昔から使われている(らしい) JMeter はあまりパフォーマンスが出ないとか書いてある記事を見かけたけど、ぼくは使ったことがないのでよくわからない。
Gatling はパフォーマンスを重視して Scala で書かれているんだけど、リクエストのシナリオを書くのに Scala の DSL を書かないといけない。こんな感じ
class MySimulation extends Simulation { val conf = http.baseUrl("http://example.com") val scn = scenario("Gatling") .exec(http("index").get("/")) .during(10 minutes) { exec( http("json").get("/json") .check(jsonPath("$.id") .saveAs("id")) ) } setUp(scn.inject(atOnceUsers(5))) .protocols(conf) }
複雑なリクエストを送りたい時には使い勝手が良いのかもしれないけれど、Scala の DSL とかよくわからないし、書きたくないので、もっと簡単に負荷検証ができるツールを作ってみた。
hakari
ツールの名前は hakari で、測りたいから hakari にした。
Easy to Install, Easy to Write Scenario.
をウリにしていて、カップラーメンを待つ3分の間にインストールから実行までできてしまう。
インストール
$ brew tap showwin/hakari $ brew install hakari
リクエストシナリオを書く
# scenario.yml TopPage: method: "GET" url: "http://example.com/" Login: method: "POST" url: "http://example.com/login" parameter: email: "user@example.com" password: "secret_password"
負荷検証実行!!!
$ hakari 2016/02/21 18:12:47 hakari Start! Number of Workers: 2 2016/02/21 18:13:48 hakari Finish! TopPage 200: 125 req, 238.66 ms/req Login 200: 110 req, 255.11 ms/req 500: 15 req, 192.18 ms/req
あっという間に負荷検証できて、ビックリする。
上の例では、2並列リクエストでテストを行っていて、1分間にトップページが125回リクエストされて、平均 238ms でレスポンスが返ってきたことがわかる。
デフォルトでは2並列リクエストで1分間の負荷検証を行うけど、もう少し細かな設定もできて、HTTP header をカスタマイズしたかったら
# myconfig.yml Header: Accept-Encoding: "gzip, deflate, sdch" Accept-Language: "ja,en-US;q=0.8,en;q=0.6" Cache-Control: "max-age=0" User-Agent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.39 Safari/537.36"
と設定ファイルを書いて
$ hakari -c myconfig.yml -s scenario2.yml -w 10 -m 2
とすると、10並列リクエストで2分間 myconfig.yml
に設定した HTTP header で scenario2.yml
のシナリオを実行できる。
まとめ
hakari は Gatling や JMeter と比べると、結果表示部分のレポート機能がまだまだ弱いので、そこをもう少し強化する必要がある。逆に、レポート機能はそんなに充実してなくて良いので、手軽にどのぐらいのリクエストをさばけるのか負荷検証したいという場合には hakari を使うと良いと思う。
昨日の午後から開発し始めて、24時間でこのぐらいのツールが作れてしまうので、Go 言語はすごい。 ぼくはすごい Gopher ではないので、テストコードも書いていないし、おそらく Go らしいコードも書けていない。。もっと勉強しなければ。
便利!! と思った方は、遠慮せずに GitHub Star ください!! → showwin/hakari