Ruby on Rails2.3 の Metal 用にコードを書き換えてみた
Ruby on Rails2.3.0RC1用にポートしたアプリの一部を Metalに書き換えてみました。今回ポートしたアプリには1つだけ高速化したい部分がありました、その部分の処理はアクセスをDBに記録しリダイレクトするだけです。
まず、Metal の情報ですが、まとまった物は発見できまんでしたが、以下の情報が参考になります。
ソースの細部は、お見せできませんが
# Allow the metal piece to run in isolation require(File.dirname(__FILE__) + "/../../config/environment") unless defined?(Rails) class Service2 def self.call(env) request = Rack::Request.new(env) if env["PATH_INFO"] =~ /^\/XXXXXX/ YYYYYY(request.env, request.params) ・・・・ redirect_to url else [404, {"Content-Type" => "text/html"}, ["Not Found"]] end end protected def self.redirect_to(url) RAILS_DEFAULT_LOGGER.info("Redirect to: #{url}") [302, {"Content-Type" => "text/html", "Location" => url}, [""]] end end
変更したのは以下の点です。
- ruby script/generate metalで Metal (コントローラ?) を作成
- params は Rack::Requestから取得する
- logger は定義されてないので RAILS_DEFAULT_LOGGER を使う
- コントローラのメソッドがインスタンスメソッドからクラスメソッドに変わったのでその対応
くらいでした。このコードはセッション等を使ってなので簡単でした ^^)
注意点としては、
- development環境 でもログにActionControllerのようなログは出ません
- development環境 でもコードの再読込は行われません
したがって、ActionController上で十分にデバック・テストしてからポーティングすべきです。
さて、速度はどうなったでしょうか?
Passenger上で動作する環境を abでテストしてみたところ
コントローラー | Concurrency | Requests/sec |
---|---|---|
ActionController | 1 | 20.98 |
Metal | 1 | 23.90 |
ActionController | 10 | 23.87 |
Metal | 10 | 65.45 |
と同時アクセスが多いときの性能はかなり改善されています ^^)
ただし、今回ポートした部分はテンプレートやセッションは使われていませんので参考程度に考えて下さい。