モックサーバに Stubby4j というのがある。
一緒に働いている方に紹介してもらったんだけど、これすごく使いやすい。 使い方は README にわかりやすく書いてあるからそれを読んでもらえばよい。 この Stubby4J、性能テストにも使いたいことがあるから、どの程度パフォーマンスがでるか試してみた。
結論としては以下のとおり。横軸が concurrency で縦軸が 1 秒あたりに捌けるリクエスト数になる。 裏でブラウジングしながら測定するなど、かなり適当な計測したけど、600 リクエストくらいは余裕で捌けそう、ということが分かった。
環境
だいたい以下のような環境で測定。GitHub - kiririmode/stubby4j-performance に一連のスクリプト置いてる。
- MacBook Pro Mid 2012
- 2.3 GHz Intel Core i7
- 16 GB 1600 MHz DDR3
- Stubby4j v3.3.0
- ApacheBench v2.3
- java 8
$ java -version java version "1.8.0_51" Java(TM) SE Runtime Environment (build 1.8.0_51-b16) Java HotSpot(TM) 64-Bit Server VM (build 25.51-b03, mixed mode)
ダルかったのは、連続でテストをしてると、一定時間 stubby4j がハング (リクエストを送っているのに、応答を返さなくなる) する点。TCP のソケット数まわりが怪しいけど調べると時間かかりそうだったので、以下のように測定スクリプトのループで都度 Stubby4J の起動・停止を行うようにした。それでも解決しなかったので、ループの最後に sleep 10 をするという荒技してる。
#!/bin/bash # リクエスト数 req=5000 # Stubby4j の起動待ち時間 time4boot=2 # 結果ファイル名 result_tsv=perf.tsv # ファイルディスクリプタ数を変更 ulimit -n 8192 # 結果ファイルをクリア : > $result_tsv # concurrency でループ for c in 1 2 5 10 20 50 100; do # stubby4j は都度立ち上げる java -jar stubby4j-3.3.0.jar -d routes.yaml & PID=$! # stubby4j の起動時間を確保 sleep $time4boot # 実行 ab -n $req -c $c -r -q 'http://127.0.0.1:8882/hello-world' | awk -v concurrency="$c" '/across all concurrent requests/ { print concurrency "\t" $4 }' >> $result_tsv # stubby4j を kill kill $PID sleep 10 done # グラフ作成 gnuplot perf.plt