![]()
[RailsConf2008] Railsの最適化・スケーリングのシナリオ
大井宏友です。今回僕がRailsConfに参加したのは、Railsを大きなサイトで採用している事例が多く、それを運用するためのノウハウを勉強したかったからです。
運用にまつわるセッションがいくつもあったのですが、それらをまとめて、主にオプティマイズとスケーリングについて、感じたことを書いてみます。
オプティマイズ
徹底的に原因を探る
何がなぜ遅いのかを徹底的に調べ、修正。誰もが(スケーリングの前に)これをまず始めにやるべきだと話をしていました。よくRailsは遅いからといってすぐにあきらめたりしますが、彼らにいわせると、遅かったり止まったりする理由はフレームワークの問題じゃなくて自分たちが書いたソースコードの問題なのがほとんどだと。
そのためのツール・方法として名前が挙がっていたのは、
- ログ解析
- pl_analyze
- FiveRuns
- New Relic
- iostat
- mtop
- gdb
まさかここでgdbが出てくるとは思いませんでしたが、ここまで徹底的に調べるんだ、というアメリカの技術者の魂を感じました。
cache!, cache!, cache!
その後で速度アップの施策を考えていくようですが、誰もが口を酸っぱくしていっていたのは、
「キャッシュしろ。」
でした。もはや、memcacheを使わないという選択肢はなく、始めから使うように実装するかんじです。
キャッシュを使う際の実ソースコードがいくつか出てきていましたので紹介します。※僕自身あまり理解できてないため、これ以上の説明はできません。ごめんなさい。
Rails2.1でのmemcache例
config.cache_store = :mem_cache_store, %w(foo-app-01 foo-app-02)
<% cache [user, :recent_messages], :epires_in => 1.minute do %>
<%= render :partial => user.messages.recent %>
<% end %>
Rails2.0での例(cache_fu)
キャッシュにセッションを入れちゃう。
ActionController::Base.session_options[:cache] = CACHE
def self.get(id)
k = CACHE.get("Kingdom:#{id}")
k = get_without_cache(:conditions=>["id = ?", id]) if k.nil?
return nil if k.nil?
return k
end
def self.get_without_cache(args={})
k = find(:first, args)
return nil if k.nil?
CACHE.set("Kingdom:#{k.id}", k)
return k
end
after_save { |obj| CACHE.set("Kingdom:#{obj.id}, obj)}
スケーリング
まずオプティマイズが先で、その後スケーリングを考えている感じ。
今どうやらもっとも一般的なのが、ApacheではなくNginx+mongrel。こんな感じで発展していきます。
この結果、多数のサーバやインスタンスができるので、その管理が大変、ということでソリューションがいくつも出てきていました。
僕が聞いたのは、Fuzed。一旦Fuzedが提供するfaceplateがInternetからのリクエストを受け、それとMasterが通信しながらあいているスレーブのMongrelに受け渡す。Masterはスレーブを常に監視していて、もしスレーブのMongrelが落ちてしまったら、すぐに新しいスレーブを立ち上げて、全体のスレーブの数をキープする、というようなもののようです。
Amazon EC2 & S3
日本からだと「遅い」という話をよく聞きますが、こちらではきわめて普通に使われていますし、おそらく最も安価に構築できるソリューションとして定着している様子。似たようなソリューションもあるが、とても高価。
とくに、S3は静的ファイルやDBファイルのバックアップ先として使われてます。
EC2の管理ツールであるRightScaleのセッションでは、Animotoがローンチ当初50台のEC2インスタンスから始めたが3日後には3500台に増やした事例を紹介していました。確かにこの芸当は自分たちでサーバを用意したのでは到底無理ですね…
プログラマ1人日が$400-1000に対して、EC2の1台当たりのコストは$900/年ということもあり、「チープ革命のチープ革命」としての地位を確立している感じです。
