Spring Bootで選択できるアプリケーションサーバの比較
Spring Boot 1.2.0 RC2でUndertowが選択できるようになり、アプリケーションサーバの選択肢が3つになりました。
- Tomcat
- Jetty
- Undertow
起動時間やパフォーマンスの比較をしたので、まとめておきます。
比較に使ったアプリは、 以前作ったISUCON4予選のSpring Boot実装 です。
ソースはここに置いてます。
サーバはISUCON運営チーム公開の公式AMIを使ってます。
AMI IDはこちらのページを参照してください。
ISUCON4 予選問題の解説と講評 & AMIの公開
公開されたAMIと上記のソースのままでは、DBサーバがボトルネックになっていて、Javaアプリのパフォーマンス比較が出来ないので
@kazeburoさんのこちらのブログエントリーにある設定を行い、ボトルネックを取り除いた状態にして比較しました。
※僕が作ったSpring Boot実装はログイン情報をセッションに保持してないので、memcachedはインストールしてません
ISUCON4 予選でアプリケーションを変更せずに予選通過ラインを突破するの術
起動コマンドオプション
Tomcat
java -Xms1G -Xmx1G -jar java-spring-boot-1.0.0.jar --server.tomcat.max-threads=200
Jetty
java -Xms1G -Xmx1G -jar java-spring-boot-1.0.0.jar
Undertow
java -Xms1G -Xmx1G -jar java-spring-boot-1.0.0.jar
アプリ起動時間
2014/11/26 訂正
Tomcat > Undertow > Jettyの順に速いです
Undertow > Tomcat > Jettyの順に速いです
Tomcat
2014-11-24 15:56:52.174 INFO --- [ main] net.isucon.isucon4.Application : Started Application in 4.78 seconds (JVM running for 5.486)
Jetty
2014-11-24 16:01:40.669 INFO --- [ main] net.isucon.isucon4.Application : Started Application in 6.306 seconds (JVM running for 7.091)
Undertow
2014-11-24 15:42:51.904 INFO --- [ main] net.isucon.isucon4.Application : Started Application in 4.927 seconds (JVM running for 5.632)
2014/11/26 追記
Jettyの起動が異常に遅かったので、手元のノートPC(CPU:Core i7-4500U Mem:4GB)と、EC2(m3.xlarge)で再計測しました。
アプリが小さくて速いCPUだと、差は小さいようです。
ノートPC(CPU:Core i7-4500U Mem:4GB)
Tomcat
2014-11-26 17:09:03.487 INFO --- [ main] net.isucon.isucon4.Application : Started Application in 4.021 seconds (JVM running for 4.647) 2014-11-26 17:09:10.764 INFO --- [ main] net.isucon.isucon4.Application : Started Application in 4.397 seconds (JVM running for 4.949) 2014-11-26 17:09:17.763 INFO --- [ main] net.isucon.isucon4.Application : Started Application in 4.07 seconds (JVM running for 4.64)
Jetty
2014-11-26 17:06:38.513 INFO --- [ main] net.isucon.isucon4.Application : Started Application in 4.461 seconds (JVM running for 5.022) 2014-11-26 17:06:47.681 INFO --- [ main] net.isucon.isucon4.Application : Started Application in 4.369 seconds (JVM running for 4.994) 2014-11-26 17:06:55.564 INFO --- [ main] net.isucon.isucon4.Application : Started Application in 4.567 seconds (JVM running for 5.202)
Undertow
2014-11-26 17:10:41.886 INFO --- [ main] net.isucon.isucon4.Application : Started Application in 3.804 seconds (JVM running for 4.338) 2014-11-26 17:10:47.676 INFO --- [ main] net.isucon.isucon4.Application : Started Application in 3.605 seconds (JVM running for 4.153) 2014-11-26 17:10:54.131 INFO --- [ main] net.isucon.isucon4.Application : Started Application in 3.825 seconds (JVM running for 4.418)
EC2(m3.xlarge)
Tomcat
2014-11-26 08:26:17.896 INFO --- [ main] net.isucon.isucon4.Application : Started Application in 4.644 seconds (JVM running for 5.405) 2014-11-26 08:26:36.408 INFO --- [ main] net.isucon.isucon4.Application : Started Application in 4.819 seconds (JVM running for 5.511) 2014-11-26 08:26:48.222 INFO --- [ main] net.isucon.isucon4.Application : Started Application in 4.995 seconds (JVM running for 5.696)
Jetty
2014-11-26 08:21:12.259 INFO --- [ main] net.isucon.isucon4.Application : Started Application in 5.748 seconds (JVM running for 6.56) 2014-11-26 08:21:35.016 INFO --- [ main] net.isucon.isucon4.Application : Started Application in 5.537 seconds (JVM running for 6.309) 2014-11-26 08:22:49.700 INFO --- [ main] net.isucon.isucon4.Application : Started Application in 5.596 seconds (JVM running for 6.339)
Undertow
2014-11-26 08:23:27.541 INFO --- [ main] net.isucon.isucon4.Application : Started Application in 4.841 seconds (JVM running for 5.539) 2014-11-26 08:23:42.013 INFO --- [ main] net.isucon.isucon4.Application : Started Application in 4.912 seconds (JVM running for 5.606) 2014-11-26 08:23:59.474 INFO --- [ main] net.isucon.isucon4.Application : Started Application in 4.848 seconds (JVM running for 5.608)
スコア
ベンチツールを3回実行した結果です
Tomcat > Jetty > Undertowの順に高スコアです
Tomcat
15:22:16 type:score success:193150 fail:0 score:41724 15:23:44 type:score success:199190 fail:0 score:43028 15:25:27 type:score success:198490 fail:0 score:42879
Jetty
15:14:30 type:score success:195830 fail:0 score:42303 15:16:41 type:score success:195930 fail:0 score:42325 15:18:59 type:score success:193940 fail:0 score:41894
Undertow
15:45:53 type:score success:185800 fail:0 score:40137 15:50:53 type:score success:190420 fail:0 score:41135 15:52:29 type:score success:187750 fail:0 score:40559
ベンチツール実行後のスレッド数
デフォルトではJettyのMaxスレッド数は30になってます。
これでは足りないので、こんな感じでカスタマイズします。
Tomcat
$ ps -efL | grep "jav[a]" | wc -l 38
Jetty
$ ps -efL | grep "jav[a]" | wc -l 33
Undertow
$ ps -efL | grep "jav[a]" | wc -l 53
CPU使用率
ベンチツール実行中のtopコマンド結果を一応貼っておきます。
UndertowはちょっとCPU使用率が高い気がしました。
ISUCON4予選では、1台のサーバでベンチツール、Webサーバ、アプリケーションサーバ、DBサーバの全てが稼働する構成です。
それぞれ別サーバで動かすとアプリケーションサーバのCPU使用率はちょっと変わるかも知れません。
Tomcat
top - 16:00:11 up 54 min, 1 user, load average: 3.88, 4.02, 3.12 Tasks: 100 total, 1 running, 99 sleeping, 0 stopped, 0 zombie Cpu0 : 70.6%us, 9.7%sy, 0.0%ni, 16.4%id, 0.7%wa, 0.0%hi, 2.7%si, 0.0%st Cpu1 : 61.8%us, 13.5%sy, 0.0%ni, 18.9%id, 0.3%wa, 0.0%hi, 5.1%si, 0.3%st Cpu2 : 69.1%us, 10.3%sy, 0.0%ni, 17.9%id, 0.0%wa, 0.0%hi, 2.3%si, 0.3%st Cpu3 : 60.8%us, 13.9%sy, 0.0%ni, 19.3%id, 0.3%wa, 0.0%hi, 5.4%si, 0.3%st Mem: 15404656k total, 1932584k used, 13472072k free, 80808k buffers Swap: 0k total, 0k used, 0k free, 261700k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 4186 isucon 20 0 1067m 105m 4360 S 186.1 0.7 0:16.68 benchmarker 4044 isucon 20 0 4622m 624m 13m S 83.6 4.2 3:04.37 java 2550 mysql 20 0 2553m 638m 6316 S 29.6 4.2 7:17.00 mysqld
Jetty
top - 16:03:45 up 58 min, 1 user, load average: 4.02, 4.02, 3.31 Tasks: 100 total, 2 running, 98 sleeping, 0 stopped, 0 zombie Cpu0 : 69.0%us, 11.6%sy, 0.0%ni, 15.6%id, 0.0%wa, 0.0%hi, 3.4%si, 0.3%st Cpu1 : 65.0%us, 13.5%sy, 0.0%ni, 17.5%id, 0.3%wa, 0.0%hi, 3.7%si, 0.0%st Cpu2 : 69.7%us, 11.6%sy, 0.0%ni, 15.0%id, 0.0%wa, 0.0%hi, 3.4%si, 0.3%st Cpu3 : 67.3%us, 12.7%sy, 0.0%ni, 15.7%id, 0.0%wa, 0.0%hi, 4.3%si, 0.0%st Mem: 15404656k total, 1707136k used, 13697520k free, 87404k buffers Swap: 0k total, 0k used, 0k free, 266932k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 4317 isucon 20 0 1071m 109m 4388 S 187.4 0.7 0:42.34 benchmarker 4237 isucon 20 0 4616m 576m 13m S 89.9 3.8 2:25.85 java 2550 mysql 20 0 2361m 452m 6316 S 31.0 3.0 8:02.93 mysqld
Undertow
top - 15:55:29 up 50 min, 1 user, load average: 4.16, 3.09, 2.54 Tasks: 100 total, 2 running, 98 sleeping, 0 stopped, 0 zombie Cpu0 : 66.9%us, 13.2%sy, 0.0%ni, 15.5%id, 0.3%wa, 0.0%hi, 4.1%si, 0.0%st Cpu1 : 73.5%us, 10.9%sy, 0.0%ni, 13.3%id, 0.0%wa, 0.0%hi, 2.4%si, 0.0%st Cpu2 : 68.0%us, 12.6%sy, 0.0%ni, 15.3%id, 0.0%wa, 0.0%hi, 4.1%si, 0.0%st Cpu3 : 67.0%us, 12.2%sy, 0.0%ni, 16.0%id, 0.3%wa, 0.0%hi, 4.4%si, 0.0%st Mem: 15404656k total, 1869552k used, 13535104k free, 71808k buffers Swap: 0k total, 0k used, 0k free, 261720k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 4009 isucon 20 0 1069m 109m 4368 S 180.0 0.7 0:28.50 benchmarker 3684 isucon 20 0 4637m 633m 13m S 102.2 4.2 6:30.34 java 2550 mysql 20 0 2489m 575m 6316 S 30.6 3.8 6:14.68 mysqld
まとめ
Tomcat8結構良いんじゃないでしょうか!