(Apache + mod_proxy_balancer + Mongrel Cluster)と
Tomcat 6上で動かしたjRuby on Railsのベンチマークに関して投稿しました。
jRuby on Railsは、PoolingRackApplicationFactoryのセマフォ獲得処理に
多くの時間を費やしており、ランタイム数を増やしても、同時リクエストの
処理スピードが伸び悩むということが分かりました。
今回は、上記のJavaクラスをチューニングして、改めてベンチマークを
とってみました。
まず、チューニングの観点は以下のとおりです。
1.config.threadsafe!でRailsアプリケーションがマルチスレッド環境に
対応している場合、プールしているRackアプリケーションに、
前回の終了を待たず、逐次リクエストをディスパッチする。
2.セマフォやsynchronizedにおける同期処理を可能な限り削減する。
1.に関してですが、まずPoolingRackApplicationFactoryクラスの挙動を変える
仕組みを持たせるため、「warble.rb」に以下の一文を追記しました。
config.webxml.rails.threaded = true
config.threadsafe!メソッド自体は、その内部処理で個々のフレームワークに対し、
個別のフラグを立てているため、threadsafe!メソッド呼ばれたことを
きちんと判断するのが難しく(railsのバージョンの違いなどを考えるとなおさら)
また、jruby-rack内でRails.configurationに実行時にアクセスするのも、ちょっと・・・
というわけで、warble.rbに設定項目を追加し、コンテキストパラメータから
その設定が取り出せるように考えました。
上記のようなカスタマイズした変数は、warblerのgemのおかげで
何もせずともwarに同梱されるweb.xmlにしっかりと反映されます。
前半の「config.webxml」の部分は、web.xmlを出力する際の指示ですので、
結果的に以下のようなコンテキストパラメータが付与されます。
<context-param>
<param-name>rails.threaded</param-name>
<param-value>true</param-value>
</context-param>
次に、
2.に対するアプローチとして、まず以下のようなコンテナクラスを作成しました。
・内部的にArrayListに委譲し、add、getなどの必要な箇所のみロックをとる。
・要素はアクセスしてきたスレッドに対して均等に割り当てるようにする。
・あるスレッドに対する要素(RackApplication)が決定したら、
スレッドローカルに要素のインデックスを格納して、次回はロックの獲得時間を
最小限にする。
あえて、ソースコードは載せませんが、上記のrails.threadedがtrueの場合、
セマフォの初期化/獲得処理をバイパスし、既存のapplicationPoolに対する
synchronizedブロックも通らないように全て修正しました。
また、アプリケーションプールには作成したコンテクラスを
使用するように修正し、デプロイしました。
その修正版でNetBeansプロファイラを利用してプロファイリングを実施しました。

前回のようにgetApplicationはホットスポットではなくなっていますが、
railsアプリそのものの呼び出し処理がホットスポットとなっていますので、
これ以上のチューニングは困難そうです。
ここで、前回同様のjmeterのシナリオでベンチマークをとりました。
|チューニング前 | チューニング後
----------------------------------------
一覧表示|921 |766
作成 |2027 |1354
更新 |1972 |1380
削除 |2024 |1138
(単位はミリ秒)
驚くほどの性能向上は見られませんでしたが、一応
期待した改修は行えているようです。
尚、今回はランタイム数を3(min,maxともに)に設定しました。
これ以上ランタイム数を増やしても、
ハードウェア(といっても仮想マシンですが)の
限界で性能が頭打ちになるようでした。
しかし残念なことにランタイム数を1にして測定した場合と
今回の結果はほとんど変わりませんでした。
ランタイム数を増やしても前回のように何もしなければ、
セマフォの獲得処理に時間を消費し、今回のように改修を
行ってもランタイム数1の場合と、性能面でそれほど
変わりないのであれば、ランタイム数は1のままが良いと
いうことなのでしょう。
とはいえ、jRuby on railsが魅力的であることに変わりは
ありません。無形ソフトウェアでは
今後もjRuby on Railsおよび周辺技術を研究して行きたいと思っています。






