こみゅすけを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 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 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で運用できる方法を見つけるか。悩むところだ。。。

このエントリーをはてなブックマークに追加

Yoichiro

(よういちろう)