理系学生日記

おまえはいつまで学生気分なのか

モックサーバStubby4jの性能

モックサーバに Stubby4j というのがある。

一緒に働いている方に紹介してもらったんだけど、これすごく使いやすい。 使い方は README にわかりやすく書いてあるからそれを読んでもらえばよい。 この Stubby4J、性能テストにも使いたいことがあるから、どの程度パフォーマンスがでるか試してみた。

結論としては以下のとおり。横軸が concurrency で縦軸が 1 秒あたりに捌けるリクエスト数になる。 裏でブラウジングしながら測定するなど、かなり適当な計測したけど、600 リクエストくらいは余裕で捌けそう、ということが分かった。 f:id:kiririmode:20160217115540p:plain

環境

だいたい以下のような環境で測定。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