Ruby on Rails

Gregg Pollack氏が3 Weeks in Rails (October 29, 2008)において次期メジャーリリースになるRuby on Rails 2.2.1についてまとめている。まずバージョン番号については説明が必要だろう。24日(米国時間)にRails 2.2 RC1が公開された。準備リリースという位置づけだがバージョン番号は2.2.0となった。このため順調に進めば次の2.2.1が正式な2.2になる。

Rails 2.2はRailsにとって注目すべきリリースになる。2.2で登場する新機能はRuby on Rails 2.2 Release Notesにまとまっているので興味がある場合はチェックしてほしい。概要でよければ3 Weeks in Rails (October 29, 2008)に大体の内容がまとまっている。

2.2の最大の特徴はスレッドセーフモードが提供されることにあるが、これには注意が必要だ。スレッドセーフになるだけであって、ネイティブスレッドで動作するようになるわけではないからだ。かといって性能があがらないというわけではない。歓迎すべきことだが多くの誤解もあるようだ。

Rails 2.2で提供されるスレッドセーフは、これまでリクエスト処理回りに存在していた粒度の荒いGiantロックを削除し、データ構造を見直して最小限の細粒度ロックに置き換えたことを意味している。Ruby on Railsのスレッドは従来どおりグリーンスレッドのままだし、ネイティブスレッドとして動作するものではない。

ではなぜスレッドセーフであることが重要かといえば、リクエスト処理が改善されるからだ。これまでGiantロックだったため一つのリクエストをさばいている間にほかのリクエストをさばけなかった。これがスレッドセーフになったため単位時間あたりに受付可能なリクエスト数が増えた。一つのRailsインスタンスでさばけるリクエスト数が増えたため、これまでプロセスとしてインスタンスを複数保持していたところを削減できる。結果として全体として性能が向上することになる。

たとえばこれまで10のRailsプロセスを動作させているとする。1プロセスあたりなんらかの単位時間あたりに処理できたリクエストが10だったとしよう。これがスレッドセーフ化されたことで1プロセスあたり20のリクエストが同じ単位時間でさばけるようになったとすれば、単純に考えれば10プロセスで単位時間あたりに200さばけることになる。またはプロセスを5つに減らしても同じリクエストが処理できるようになる。もちろんこんな単純なものではないが、大枠はそんなところだ。

さらにRailsをJRubyで実行させると、スレッドがネイティブスレッドとして処理されるためプロセスが1つだけでよくなる。Rails 2.2はRuby 1.9とJRuby 1.9に対応する予定だ。どこまで実用的に使えるかはRubyと比べるとデータ不足だが、JRuby on Railsでさらに性能の引き上げを調査してみるのも悪くない選択肢だ。

またスレッドセーフモードを有効にして実行する場合、自身が開発するソースコードもスレッドセーフで動作するように書き換える必要がある。どのように書けばいいかはPratik Naik氏がThread safety for your Rails 22において説明しているので、開発する場合には参考にするといいだろう。