先日の Spring Bootで選択できるアプリケーションサーバの比較 に続いて、コネクションプーリングの比較をやってみました。

 

Sprinb Boot 1.2.0 RC2で標準で選択出来るコネクションプーリングは以下です。
※この4つ以外は使えない訳ではありません。pom.xmlに書けば何でも使えるようになります。

  1. Tomcat JDBC Connection Pool (Spring Bootのデフォルト)
  2. HikariCP
  3. Commons DBCP
  4. 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(デフォルト)にしています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/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)にしたい場合はこんな感じです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/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を選択しよう