こみゅすけをJRuby on Glassfishに移行!

機能追加をして久々にmongrelを再起動したら,こみゅすけが起動しなくなった。というか,4つ動かしていたrailsアプリが全滅。すっごい緊急事態。
稼働させているサーバは,Fedora Core 6。64bitのクアッドコアCPUで,uname -aの結果は以下の通り。

Linux chako 2.6.20-1.3002.fc6xen #1 SMP Mon Aug 13 14:21:21 EDT 2007 x86_64 x86_64 x86_64 GNU/Linux

yumを毎日自動起動させていたのだが,先週の10月11日にruby関連のパッケージが「1.8.5.113-1.fc6」になった模様。たぶんこれが原因。ruby -vとrails -vの出力結果は以下の通り。

ruby 1.8.5 (2007-09-24 patchlevel 114) [x86_64-linux]
Rails 1.2.3

発生しているエラーは,NoMemoryError。あれ?機能追加した結果メモリ不足になった?と疑ってみるも,何もいじっていないrailsアプリもダメなため,アプリケーションコードが悪いわけではなさそう。具体的なエラー内容は,以下の通り。

NoMemoryError (negative allocation size (or too big)):
/usr/lib/ruby/gems/1.8/gems/actionpack-1.13.3/lib/action_controller/benchmarking.rb:86:in `sprintf’
/usr/lib/ruby/gems/1.8/gems/actionpack-1.13.3/lib/action_controller/benchmarking.rb:86:in `active_record_runtime’
/usr/lib/ruby/gems/1.8/gems/actionpack-1.13.3/lib/action_controller/benchmarking.rb:69:in `perform_action_without_rescue’
/usr/lib/ruby/gems/1.8/gems/actionpack-1.13.3/lib/action_controller/rescue.rb:83:in `perform_action’
/usr/lib/ruby/gems/1.8/gems/actionpack-1.13.3/lib/action_controller/base.rb:430:in `send’
/usr/lib/ruby/gems/1.8/gems/actionpack-1.13.3/lib/action_controller/base.rb:430:in `process_without_filters’
/usr/lib/ruby/gems/1.8/gems/actionpack-1.13.3/lib/action_controller/filters.rb:624:in `process_without_session_management_support’
/usr/lib/ruby/gems/1.8/gems/actionpack-1.13.3/lib/action_controller/session_management.rb:114:in `process’
/usr/lib/ruby/gems/1.8/gems/actionpack-1.13.3/lib/action_controller/base.rb:330:in `process’
/usr/lib/ruby/gems/1.8/gems/rails-1.2.3/lib/dispatcher.rb:41:in `dispatch’
/usr/lib/ruby/gems/1.8/gems/mongrel-1.0.1/lib/mongrel/rails.rb:78:in `process’
/usr/lib/ruby/gems/1.8/gems/mongrel-1.0.1/lib/mongrel/rails.rb:76:in `synchronize’
/usr/lib/ruby/gems/1.8/gems/mongrel-1.0.1/lib/mongrel/rails.rb:76:in `process’
/usr/lib/ruby/gems/1.8/gems/mongrel-1.0.1/lib/mongrel.rb:618:in `process_client’
/usr/lib/ruby/gems/1.8/gems/mongrel-1.0.1/lib/mongrel.rb:617:in `each’
/usr/lib/ruby/gems/1.8/gems/mongrel-1.0.1/lib/mongrel.rb:617:in `process_client’
/usr/lib/ruby/gems/1.8/gems/mongrel-1.0.1/lib/mongrel.rb:736:in `run’
/usr/lib/ruby/gems/1.8/gems/mongrel-1.0.1/lib/mongrel.rb:736:in `initialize’
/usr/lib/ruby/gems/1.8/gems/mongrel-1.0.1/lib/mongrel.rb:736:in `new’
/usr/lib/ruby/gems/1.8/gems/mongrel-1.0.1/lib/mongrel.rb:736:in `run’
/usr/lib/ruby/gems/1.8/gems/mongrel-1.0.1/lib/mongrel.rb:720:in `initialize’
/usr/lib/ruby/gems/1.8/gems/mongrel-1.0.1/lib/mongrel.rb:720:in `new’
/usr/lib/ruby/gems/1.8/gems/mongrel-1.0.1/lib/mongrel.rb:720:in `run’
/usr/lib/ruby/gems/1.8/gems/mongrel-1.0.1/lib/mongrel/configurator.rb:271:in `run’
/usr/lib/ruby/gems/1.8/gems/mongrel-1.0.1/lib/mongrel/configurator.rb:270:in `each’
/usr/lib/ruby/gems/1.8/gems/mongrel-1.0.1/lib/mongrel/configurator.rb:270:in `run’
/usr/lib/ruby/gems/1.8/gems/mongrel-1.0.1/bin/mongrel_rails:127:in `run’
/usr/lib/ruby/gems/1.8/gems/mongrel-1.0.1/lib/mongrel/command.rb:211:in `run’
/usr/lib/ruby/gems/1.8/gems/mongrel-1.0.1/bin/mongrel_rails:243
/usr/bin/mongrel_rails:16:in `load’
/usr/bin/mongrel_rails:16

sprintfメソッドでエラーになってる。そこで,NoMemoryErrorとsprintfでググってみると,同じ現象になってる人を発見
[ruby-dev:31404] negative allocation size in rb_f_sprintf
どうやら,x86_64環境でしか発生しない現象っぽい。上記で載ってる現象再現手順を実行してみると,見事に再現する。

yoichiro$ ruby -ve ‘printf “%d\n”, 0.9′
ruby 1.8.5 (2007-09-24 patchlevel 114) [x86_64-linux]
-e:1:in `printf’: negative allocation size (or too big) (NoMemoryError)
  from -e:1

これをmacでやっても,エラーにはならない。

yoichiro$ ruby -ve ‘printf “%d\n”, 0.9′
ruby 1.8.6 (2007-03-13 patchlevel 0) [i686-darwin8.10.1]
0

どうすればいいのか,さっぱりわからない。「x86_64環境でrubyとrailsはテストされていない」ということ?うーん。
こみゅすけをこのままダウンさせておくわけにはいかないので,「railsが動く別の環境」を考える。そう,JRubyがある。JRuby上でrailsアプリはそのまま動作するはずなので,さっそくこみゅすけをJRuby上で動作確認することにした。mac上でJRubyをコンパイルして,railsなどをインストール。いろんなサイトを見ると,ActiveRecord-JDBCでデータベース接続を行っているっぽいので,インストールしてdatabase.ymlファイルなどを書き換える。
実行してみると,基本的にdatabase.ymlとenvironment.rbファイルの書き換えだけで,JRuby+ActiveRecord-JDBCで動作した。と思ったら,MySQLから取得した文字列が見事に文字化けしている。いろいろ文字コード関連の設定を試みてみるが,どれも改善に至らず。調べてみると,ここに載ってるように,同じ現象になっている人がいる。しかも,どうやらActiveRecord-JDBCはUTF-8の扱いでバグがあるらしく,パッチを当てないとダメらしい。
rubyもダメ。jrubyもダメ。万事休す。
人間の思い込みは怖いもので,jrubyの場合はActiveRecord-JDBCを使わなければいけないものだと思っていたが,別にActiveRecordのみでjrubyでもデータベースは扱えることに気がつく。jrubyを試している人がこぞってActiveRecord-JDBCを使っているのは,何故だろうか。。。
mac上でjrubyによるこみゅすけの稼働ができることを確認後,運用しているサーバにGlassfish v2をインストール。GoldSpikeプラグインをインストールして,warファイルを構築。その際にdatabase.ymlファイルの編集とenvironment.rbファイルを編集して,productionモードで動作するようにしておく。Glassfishにデプロイして,mod-proxyの設定を変更。すると,比較的あっさりとこみゅすけが動作を開始した。
というわけで,今日からこみゅすけは,JRuby on Glassfishで運用をしている。
今後JRubyでいくか,何とかmongrelで運用できる方法を見つけるか。悩むところだ。。。

Trackback URL:



Get Adobe Flash playerPlugin by wpburn.com wordpress themes