Spring Bootのコネクションプーリングの比較
先日の Spring Bootで選択できるアプリケーションサーバの比較 に続いて、コネクションプーリングの比較をやってみました。
Sprinb Boot 1.2.0 RC2で標準で選択出来るコネクションプーリングは以下です。
※この4つ以外は使えない訳ではありません。pom.xmlに書けば何でも使えるようになります。
- Tomcat JDBC Connection Pool (Spring Bootのデフォルト)
- HikariCP
- Commons DBCP
- Commons DBCP2
比較に使ったアプリ
比較に使ったアプリは、 以前作ったISUCON4予選のSpring Boot実装 です。
ソースはここに置いてます。
サーバはISUCON運営チーム公開の公式AMIを使ってます。
AMI IDはこちらのページを参照してください。
ISUCON4 予選問題の解説と講評 & AMIの公開
公開されたAMIと上記のソースのままでは、DBサーバがボトルネックになっていて、Javaアプリのパフォーマンス比較が出来ないので
@kazeburoさんのこちらのブログエントリーにある設定を行い、ボトルネックを取り除いた状態にして比較しました。
※僕が作ったSpring Boot実装はログイン情報をセッションに保持してないので、memcachedはインストールしてません
ISUCON4 予選でアプリケーションを変更せずに予選通過ラインを突破するの術
スコア
ベンチツールを3回実行した結果です
Tomcat JDBC Connection Pool >= HikariCP > Commons DBCP > Commons DBCP2 の順に高スコアです
Tomcat JDBC Connection Pool
16:17:57 type:score success:195750 fail:0 score:42286 16:19:13 type:score success:202230 fail:0 score:43684 16:20:30 type:score success:201780 fail:0 score:43589
HikariCP
15:24:32 type:score success:195100 fail:0 score:42146 15:25:48 type:score success:200602 fail:6 score:43333 15:27:04 type:score success:197450 fail:0 score:42654
Commons DBCP
16:04:21 type:score success:192830 fail:0 score:41656 16:05:37 type:score success:197950 fail:0 score:42761 16:06:53 type:score success:196380 fail:0 score:42423
Commons DBCP2
15:51:10 type:score success:191080 fail:0 score:41278 15:52:28 type:score success:191550 fail:0 score:41379 15:53:45 type:score success:194030 fail:0 score:41914
設定したJVMオプション
ベンチマークとは関係ないですが、実運用で使う事を想定して運用に必要なログやJMXなどを設定しました。
今回は短時間でのベンチなので、ヒープを多くしてパラレルGC(デフォルト)にしています。
#!/bin/bash
java \
\
-Xms2g \
-Xmx2g \
\
-verbose:gc \
-Xloggc:/tmp/gc.`date +%Y%m%d-%H%M%S`.log \
-XX:+UseGCLogFileRotation \
-XX:GCLogFileSize=10M \
-XX:NumberOfGCLogFiles=5 \
-XX:+PrintGC \
-XX:+PrintGCDetails \
-XX:+PrintGCDateStamps \
-XX:+PrintGCTimeStamps \
-XX:+PrintClassHistogram \
\
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/tmp \
-XX:OnOutOfMemoryError="kill -9 %p" \
-XX:ErrorFile=/tmp/hs_err_pid%p.log \
\
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.port=8686 \
\
-jar $@
コンカレント マーク&スイープGC(CMS)にしたい場合はこんな感じです。
#!/bin/bash
java \
\
-Xms2g \
-Xmx2g \
\
-verbose:gc \
-Xloggc:/tmp/gc.`date +%Y%m%d-%H%M%S`.log \
-XX:+UseGCLogFileRotation \
-XX:GCLogFileSize=10M \
-XX:NumberOfGCLogFiles=5 \
-XX:+PrintGC \
-XX:+PrintGCDetails \
-XX:+PrintGCDateStamps \
-XX:+PrintGCTimeStamps \
-XX:+PrintClassHistogram \
\
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/tmp \
-XX:OnOutOfMemoryError="kill -9 %p" \
-XX:ErrorFile=/tmp/hs_err_pid%p.log \
\
-XX:+UseConcMarkSweepGC \
-XX:CMSInitiatingOccupancyFraction=70 \
-XX:+UseCMSInitiatingOccupancyOnly \
\
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.port=8686 \
\
-jar $@
OracleのJava8を使用しました
java version "1.8.0_25" Java(TM) SE Runtime Environment (build 1.8.0_25-b17) Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)
JVMオプションで参考にしたブログエントリー
Java 7 CMS GCの基本的な情報の整理
JVM Operation Casual Talks やった/話した
Spring Bootアプリ用起動スクリプト
Javaトラブルに備えよう
Javaはどのように動くのか~図解でわかるJVMの仕組み 第9回 [最終回]HotSpot JVMのGCを選択しよう