Jetty6と7をJava6と7でパフォーマンス実験してみました
rpscala第45回で黙々とパフォーマンス実験をしてきました。
Scala勉強会第45回 in 秋葉原 : ATND
勉強会第45回 - Scala勉強会 in 東京
内容
Jetty6とJetty7のパフォーマンス実験です。
Java6とJava7をそれぞれ組み合わせて、単純なアプリケーションのスループットを測りました。
なんでこれをScala勉強会でやってるのか、というと、動かしているアプリケーションがScalatraだからです。
要するに、ScalaのWebアプリケーションを載っけるのに、Jetty6と7、どっちが速いのか+Java7だったらどうなのか、という実験です。
結果
- Jetty7 + Java6が最速でした。
というわけで、ScalaのWebアプリならJetty7をJava6で使うと速いです。Jetty側でいろいろと最適化されているものと思われます。
なお、Jetty6ではJava6よりもJava7のほうが多少速かったので、Java7が遅いという訳ではないようです。
※ 限られた実験結果です。業務で使う人はもっとちゃんと実験しましょう。
環境
EC2のlargeインスタンス1でJettyを動かし、もう1つのlargeインスタンスから負荷をかける構成。
OSはAmazon Linux 64bit
各コンポーネントのバージョンは以下のとおり。
- Jetty7 7.4.5
- Jetty6 6.1.26
- JDK7 GA
- JDK6 1.6.0 u26
動かしたアプリケーション
このmaven archetypeで作ったサンプルアプリケーション(HelloWorld)
Srirangan/simple-scalatra-archetype · GitHub
の
ScalaとScalatraのバージョンを以下のとおり変えたものです。
- Scala 2.8.1 => 2.9.0-1
- Scalatra 2.0.0M3 => 2.0.0M4
mvn packageでビルドしたwarをjettyのwebappディレクトリにデプロイして動かしました。
Jettyの設定
Jetty7の設定に合わせて、Jetty6のNIOコネクタのlowResourcesConnectionsを5000から20000に変更してあります。
その他の値はデフォルトの状態です。
測定方法
- Jetty起動
- ab -n 10000 -c 100 を5回(ならし)
- ab -n 10000 -c 100 を5回(計測して平均request/secを取る)
数字
数値はrequest/secです。
構成 | スループット |
---|---|
Jetty6 - Java6 | 2811 |
Jetty6 - Java7 | 3104 |
Jetty7 - Java6 | 4730 |
Jetty7 - Java7 | 4329 |
おまけ
Tomcatも測ってみました。
結果、Tomcat7はNIOコネクタに変えると遅いんですが、標準のブロッキングIOのコネクタが速かったです。Jettyよりも。
構成 | スループット |
---|---|
Tomcat7.0.19 - Java6 | 5361 |
Tomcat7.0.19 - Java7 | 5198 |
Tomcat7.0.19 NIO - Java6 | 3618 |
Tomcat7.0.19 NIO - Java7 | 3452 |
Tomcat6.0.32 - Java6 | 4212 |
Tomcat6.0.32 - Java7 | 4370 |
Tomcat6.0.32 NIO - Java6 | 4578 |
Tomcat6.0.32 NIO - Java7 | 4211 |
なお、あくまでデフォルトの設定で、かつこの環境で速かっただけなので、必ずしも常にTomcat7がJetty7より速いわけではないです。
また機会があったら、もっと突っ込んで調べようと思います。