2012-06-25 21 views
6

Ruby on Rails 3.1.3アプリケーションでUnicornの設定を最適化する方法に興味があります。私は現在、アプリケーションが負荷テスト中にCPUにバインドされているように見えるため、High-CPU Extra Large Instanceで14のワーカープロセスを生成しています。シミュレーションロードテストでリクエストを1秒間に約20回再生すると、インスタンスの8つのコアすべてがピークに達し、ボックスの負荷が最大7-8にまで上昇します。各ユニコーンインスタンスは、約56〜60%のCPUを使用しています。負荷テスト中のUnicorn CPU使用率のスパイク、最適化方法

私はこれを最適化する方法は何か不思議ですか?私はこのサイズのインスタンスに毎秒多くのリクエストを流すことができるようにしたいと思います。他のすべてのI/Oと同じように、メモリは完全に正常です。テスト中にCPUが動揺しています。

+0

ruby​​ 1.9を使用していますか?もしそうでなければ、それは助けるかもしれません。 – Reactormonk

+0

私はRuby 1.9.3を使用しています – randombits

+4

あなたのコード(ruby-prof)のプロファイルが遅い理由を調べ、ボトルネックを書き直してみてください。速くなるまで繰り返す。 0の情報では、あなたのコードがなぜ高速でないのかを推測することはできません。 –

答えて

1

まず、45〜60%のCPUでインスタンスを望んでいない可能性があります。その場合、トラフィックスパイクが発生すると、すべてのインスタンスが停止します。

次に、14個のUnicornインスタンスが大きいようです。 Unicornはスレッドを使用しません。むしろ、各プロセスは1つのスレッドで実行されます。ユニコーンのマスタープロセスは、それが処理できる場合にのみselectスレッドになります。このため、コアの数は、Unicornでパフォーマンスを測定するために使用する指標ではありません。

より慎重な設定では、1インスタンスあたり4つのUnicornプロセスが使用される可能性があり、毎秒5〜8個の要求に応答します。次に、CPU使用率が約35%になるまでインスタンスの数を調整します。これにより、ストレスの多い「毎秒20件のリクエスト」シナリオでの安定性が保証されます。

最後に、Godを使用すると、より荒々しい統計情報と詳細を取得できます。

+2

1)OPは負荷テスト中だと言ったので、これはトラフィックスパイクです。 2)スレッド化されたプロセスがコアの数に関係しないことは何ですか? –

6

CPUにバインドされている場合は、コアを持っている以上のユニコンプロセスを使用しないでください。そうしないと、システムがオーバーロードされ、スケジューラが遅くなります。あなたはabを使ってdevの箱でこれをテストすることができます。 2つのユニコーンが20を上回ることに気づくでしょう(数はコアに依存しますが、そのコンセプトは成り立ちます)。

このルールの例外は、IOバウンドの場合です。この場合、メモリが保持できる数だけユニコーンを追加します。

IOバインドされたリクエストを多くのユニコーンをホストする別のアプリケーションサーバーにルーティングするのが良いパフォーマンスの仕組みです。たとえば、低速SQL問合せを使用するリクエストがある場合、またはクレジット・カード・トランザクションなどの外部リクエストを待機している場合などです。 nginxを使用している場合は、IOバインドされたリクエストのアップストリームサーバを定義し、それらのURLを40ユニコーンのボックスに転送します。あなたは8コアを持っていると言っていますが、あなたのスケジューラーがハイパーバイザで、すでに非常に忙しいので、4〜6を試してみたいかもしれません。

また、わかりにくい割合のパーセンテージを取得することで、信頼性の高いCPU使用率を得ることができます。

1

高いCPU超過インスタンスの場合、1秒あたり20リクエストは非常にです。コードに問題がある可能性があります。ユニコーン特有の問題はあまり起こりそうもないようです。疑わしい場合は、別のアプリサーバーを試して、それがまだ発生することを確認することができます。このシナリオでは

、私は

1 ...について考えることと思い質問 - あなたはコード内でCPUを集中的に何かをやっている - 多分本当にデータベース内にあるべき何かを。たとえば、大規模なレコードセットを取り戻し、ルビー/レールでそれをループしてソートするなどの操作を行うと、データベース内ではなく、このレベルのCPUボトルネックが説明されます。この場合の推奨事項は、より多くのことを行い、レールの負荷を取り除くためにクエリを改良することです。たとえば、sqlを使用するのではなく、コントローラで結果セットをソートする場合、このような問題が発生します。

2 - 共有リソースへのアクセスや、競合が問題になる可能性のあるバニラの粗末なアプリに比べて珍しいことはありますか?

3 - 特にリソースの競合があった場合、CPUを焼損させるループがありますか?

4 - 問題のコントローラロジックのさまざまな部分のフックを外してください。たとえば、代わりに静的なhello worldレスポンスを返すようにコードをハックすると、それはどれくらいスケールされますか?私は突然ユニコーンがすごく速くなると賭ける。次に、遅さの原因を発見するまで、コードの一部を元に戻してみてください。

関連する問題