dominion525の日記

2010-05-12

Ubuntu10.04 で Ruby Enterprise Edition を使う

| 04:26 | Ubuntu10.04 で Ruby Enterprise Edition を使うを含むブックマーク

Ruby Enterprise Edition(REE)とは

Ruby Enterprise Edition(REE) は Ruby 1.8.x の評価器(主にGC)を修正することで、メモリ周辺の性能を大幅に改善したもの。おおざっぱには次の特徴を持つ。

  • メモリアロケータに tcmalloc(google-perftoolsに含まれる)を採用し高速にメモリを確保
  • Mark & Sweep なガベージコレクタにBitmap markingを導入した
    • Copy-on-write に優しくなり、メモリ消費量が低減
    • マーク処理が高速化
      • ただし単純な実行速度自体には悪影響を与える場合もある
      • トータルでは高速化している模様

というわけで、メモリを大量に消費しがちなRailsアプリケーションの実行環境として採用されることが増えている(New York Timesとか37signalsが有名)。

Ubuntu10.04 に REE をインストールするメモ。

普通はtarball からコンパイルするんですけど、Ubuntuにはもうバイナリパッケージが提供されています。素敵すぎです。

http://www.rubyenterpriseedition.com/download.html

$ wget http://rubyforge.org/frs/download.php/68718/ruby-enterprise_1.8.7-2010.01_i386.deb
$ sudo dpkg -i ruby-enterprise_1.8.7-2010.01_i386.deb

これで /usr/local/bin/rubyインストールされます。

$ /usr/local/bin/ruby -v
 ruby 1.8.7 (2009-12-24 patchlevel 248) [i686-linux], MBARI 0x8770, Ruby Enterprise Edition 2010.01

次にPassengerを再構築する必要があります。さっきのページに書いてあるとおりですね、親切!

$  sudo  /usr/local/bin/passenger-install-apache2-module

表示されるがままに、apacheモジュールを更新します。

:/etc/apache2/mods-avaiable/passenger.load
   LoadModule passenger_module /usr/local/lib/ruby/gems/1.8/gems/passenger-2.2.9/ext/apache2/mod_passenger.so
:/etc/apache2/mods-avaiable/passenger.conf
   PassengerRoot /usr/local/lib/ruby/gems/1.8/gems/passenger-2.2.9
   PassengerRuby /usr/local/bin/ruby

さらにREEは専用のgem環境が独立しています。よってRoRアプリケーションが、既存のCRubyに依存したgemを参照しているとエラーを吐いて起動しなくなります。こんな感じ。

 no such file to load -- mysql (MissingSourceFile)

aptで導入した libmysql-ruby1.8が不適切だとのお達し。なので、これを更新します。単にREE用のgemを使うだけですね。

$  sudo /usr/local/bin/gem install mysql

これでうまくいきました。

メモリ使用量の確認は passenger-memory-stats で行います。

$ sudo /usr/local/bin/passenger-memory-stats

CRuby の場合:

  1989   80.6 MB  40.5 MB  Passenger ApplicationSpawner: /var/rails/xxxx
  1995   80.6 MB  40.5 MB  Rails: /var/rails/xxxx

REE の場合:

  3710  76.0 MB  26.8 MB  Passenger ApplicationSpawner: /var/rails/xxxx
  3712  76.0 MB  26.8 MB  Rails: /var/rails/xxxx

条件が完全に同一ではないので目安程度だけど、公称通り33%削減されてます。CoWが有効に機能するということなら、プロセス数が増えるともっと効果的なのかなぁ?今のところ実行速度よりもメモリの方が重要な資源なので、この改善は非常に有り難いです。

トラックバック - http://d.hatena.ne.jp/dominion525/20100512/1273692373