私はFacebook上でのウイルス増殖のために負荷が高いいくつかのレールアプリケーションに取り組んできました。
あなたの雑種数は、いくつかの要因に基づいている必要があります。あなたの雑種がAPI呼び出しをしたり、電子メールを配信して応答を待つ必要がある場合は、可能な限り多く実行する必要があります。それ以外の場合は、CPUコアごとに1つの雑用を維持しようとします。
サーバーでフェアプロキシバランサ(ラウンドロビンではありません)を使用していることを確認してください。ここでこれを行いnginxのモジュールがある:http://github.com/gnosek/nginx-upstream-fair/tree/master
そしてここでは、負荷を処理するアプリケーションのパフォーマンスを改善し、ベンチマーク上の他のいくつかのヒントがあります:
ActiveRecordのが
最も一般的な問題は、アプリケーションの顔をレールActiveRecordオブジェクトの使い方が貧弱です。 1つだけが必要な場合は、100のクエリーを作成するのは非常に簡単です。これがアプリケーションで問題になるかどうかを判断する最も簡単な方法は、New Relicを設定することです。あなたのサイトの各メジャー・ページにリクエストした後、新しいSQLの概要を見てみましょう。非常によく似たクエリが多数表示されている場合(ID = 1の投稿から*を選択し、ID = 2の投稿から*を選択し、*から投稿を選択...)、これは次のものを使用する必要がある兆候です。あなたのActiveRecord呼び出しの1つに含まれています。
他のいくつかの基本的なActiveRecordのヒント
(これらは、私の頭の上から私は考えることができるだけのものです):あなたはすでにそれをやっていない場合
、正しく使用してくださいデータベーステーブルのインデックス。
ビュー内でデータベース呼び出しを行うことは避けてください。特に部分的には、ビューでどのくらいデータベースクエリを行っているかを追跡するのが非常に簡単です。すべてのクエリと計算をモデルまたはコントローラにプッシュします。
イテレータでクエリを作成しないようにします。通常これは:includeを使って行うことができます。
大規模なデータセット用のActiveRecordオブジェクトをできるだけ構築することは避けてください。 Post.find(:all).sizeのような呼び出しを行うと、データベース内のすべてのPostに対して新しいクラスがインスタンス化されます(大きなクエリでも可能です)。この場合、Post.count(:all)を使用して、単一の高速クエリを作成し、オブジェクトをインスタンス化せずに整数を返すことができます。
User..has_many :objects
のような関連付けは、user.objects
とuser.object_ids
の両方の方法を作成します。後者はActiveRecordオブジェクトのインスタンス化をスキップし、はるかに高速になります。特に多数のオブジェクトを処理する場合、これは高速化のための良い方法です。
可能であれば、named_scopeを学び、使用してください。コードを小さくすると、効率的なクエリを簡単に作成できます。リクエストを処理しているときに、外部サービスへのAPI呼び出しを行うことができませんできるだけ多くの
外部のAPI & actionmailerの
。応答が受信されるまで、サーバーはコードの実行を停止します。これはロード時間を増やすだけでなく、あなたの雑種は新しいリクエストを処理することができません。
リクエスト中に絶対に外部呼び出しを行う必要がある場合は、できるだけ多くの雑種を実行する必要があります。その多くがAPI応答を待っていて、何もしない状況に陥る可能性があるからです。 (これはFacebookアプリケーションを構築するときの非常に一般的な問題です)
場合によってはメールの送信にも同じことが言えます。多くのユーザーが短時間でサインアップすることを期待している場合は、ActionMailerがメッセージを配信するのに必要な時間をベンチマークしてください。ほとんど瞬間的でない場合は、電子メールをデータベースに格納し、別のスクリプトを使用して配信することを検討する必要があります。
BackgroundRBなどのツールがこの問題を解決するために作成されました。
キャッシュ
Here's a good guide on the different methods of caching in rails.
ベンチマーク(パフォーマンスの問題の場所) あなたは方法が遅くなることが疑われる場合は、コンソールでそれをベンチマークしてみてください。ここに例があります:
>> Benchmark.measure { User.find(4).pending_invitations }
=> #<Benchmark::Tms:0x77934b4 @cutime=0.0, @label="", @total=0.0, @stime=0.0, @real=0.00199985504150391, @utime=0.0, @cstime=0.0>
アプリケーションが遅いメソッドを追跡してください。それらはあなたが頻繁に実行することを避けたいものです。場合によっては、Railsにクエリキャッシュがあるため最初の呼び出しだけが遅くなります。 Memoizationを使用して、自分でメソッドをキャッシュすることもできます。
NewRelicは、メソッドとSQL呼び出しの実行時間の概要も示します。
幸運を祈る!
EYの要点は、需要に沿ってスライスを増やすことができたと思いましたか? – Chris
もちろんこれは可能ですが、それが起こってからそれを実現するまでの間に、またEYと実際にボックスをセットアップすることを伝えている間に、時間があります。 AmazonのECC –