1. ホーム
  2. Blog
  3. [RailsConf2008] Railsの最適化・スケーリングのシナリオ

[RailsConf2008] Railsの最適化・スケーリングのシナリオ

大井 宏友

大井 宏友

イベント,海外

大井宏友です。今回僕がRailsConfに参加したのは、Railsを大きなサイトで採用している事例が多く、それを運用するためのノウハウを勉強したかったからです。

運用にまつわるセッションがいくつもあったのですが、それらをまとめて、主にオプティマイズとスケーリングについて、感じたことを書いてみます。

オプティマイズ

徹底的に原因を探る

何がなぜ遅いのかを徹底的に調べ、修正。誰もが(スケーリングの前に)これをまず始めにやるべきだと話をしていました。よくRailsは遅いからといってすぐにあきらめたりしますが、彼らにいわせると、遅かったり止まったりする理由はフレームワークの問題じゃなくて自分たちが書いたソースコードの問題なのがほとんどだと。

そのためのツール・方法として名前が挙がっていたのは、

まさかここで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。こんな感じで発展していきます。


最初はMongrel一つ。


NginxリバースプロキシでMongrelを複数たてる。


NginxとMongrelを複数のサーバに分ける。


LBを入れてNginxも分散。

この結果、多数のサーバやインスタンスができるので、その管理が大変、ということでソリューションがいくつも出てきていました。

僕が聞いたのは、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/年ということもあり、「チープ革命のチープ革命」としての地位を確立している感じです。

トップへ戻る