Spring Boot 1.2.0 RC2でUndertowが選択できるようになり、アプリケーションサーバの選択肢が3つになりました。

  1. Tomcat
  2. Jetty
  3. 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結構良いんじゃないでしょうか!