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に変更してあります。
その他の値はデフォルトの状態です。

測定方法

  1. Jetty起動
  2. ab -n 10000 -c 100 を5回(ならし)
  3. 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より速いわけではないです。
また機会があったら、もっと突っ込んで調べようと思います。