Ruby on Rails2.3 の Metal 用にコードを書き換えてみた

Ruby on Rails2.3.0RC1用にポートしたアプリの一部を Metalに書き換えてみました。今回ポートしたアプリには1つだけ高速化したい部分がありました、その部分の処理はアクセスをDBに記録しリダイレクトするだけです。

http://www.rubyonrails.org/images/rails.png

まず、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

変更したのは以下の点です。

くらいでした。このコードはセッション等を使ってなので簡単でした ^^)

注意点としては、

  • 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


と同時アクセスが多いときの性能はかなり改善されています ^^)
ただし、今回ポートした部分はテンプレートやセッションは使われていませんので参考程度に考えて下さい。