6

Ruby on Rails 3.1.3 アプリ用に Unicorn セットアップを最適化する方法に興味があります。負荷テスト中にアプリケーションが CPU バウンドになっているように見えるため、現在、ハイ CPU エクストラ ラージ インスタンスで 14 のワーカー プロセスを生成しています。1 秒あたり約 20 リクエストのシミュレーション負荷テストでリクエストを再生すると、インスタンスの 8 つのコアすべてがピークアウトし、ボックスの負荷が 7 ~ 8 まで急増します。各ユニコーン インスタンスは、約 56 ~ 60% の CPU を使用しています。

これを最適化する方法は何ですか?このサイズのインスタンスに 1 秒あたりにより多くのリクエストを送信できるようにしたいと考えています。メモリは、他のすべての I/O と同様に問題ありません。テスト中に CPU が過負荷になっています。

4

3 に答える 3

6

CPU バウンドの場合は、コアよりも多くのユニコーン プロセスを使用したくありません。そうしないと、システムが過負荷になり、スケジューラの速度が低下します。ab を使用して開発ボックスでこれをテストできます。2 つのユニコーンが 20 よりも優れていることがわかります (数はコアによって異なりますが、概念は当てはまります)。

このルールの例外は、IO がバインドされている場合です。その場合、メモリが保持できる限り多くのユニコーンを追加します。

優れたパフォーマンスの秘訣は、多くのユニコーンをホストする別のアプリ サーバーに IO バウンド リクエストをルーティングすることです。たとえば、遅い SQL クエリを使用するリクエストがある場合や、クレジット カード トランザクションなどの外部リクエストを待機している場合です。nginx を使用している場合は、IO バウンド リクエスト用のアップストリーム サーバーを定義し、それらの URL を 40 個のユニコーンを含むボックスに転送します。CPUバウンドまたは非常に高速なリクエストで、8つのユニコーンを備えたボックスに転送します(8つのコアがあると述べましたが、awsでは、スケジューラーがハイパーバイズされており、すでに非常にビジーであるため、4〜6を試してください).

また、あいまいなパーセンテージのパーセンテージを取得するため、信頼できる CPU 使用率を提供する aws を当てにできるかどうかもわかりません。

于 2012-06-27T07:39:18.943 に答える
1

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

このシナリオでは、私が考えている質問...

1 - コード内で CPU を集中的に使用するようなことを行っていますか? おそらく、実際にはデータベースにあるべきことです。たとえば、大きなレコードセットを戻し、それを ruby​​/rails でループして並べ替えやその他の操作を行う場合、データベース内ではなくこのレベルでの CPU ボトルネックが説明されます。この場合の推奨事項は、クエリを改良してより多くのことを行い、レールの負担を軽減することです。たとえば、SQL ではなくコントローラーで結果セットを並べ替えると、このような問題が発生します。

2 - 共有リソースへのアクセスや、競合が問題になる可能性のある何かなど、通常の crud アプリと比較して異常なことを行っていますか?

3 - 特にリソースの競合があった場合に、CPU を消費する可能性のあるループはありますか?

4 - 問題のコントローラー ロジックのさまざまな部分をフック解除してみてください。たとえば、代わりに静的な hello world 応答を返すようにコードをハックした場合、どの程度スケールしますか? 突然、ユニコーンが猛烈に速くなるに違いない。次に、速度低下の原因がわかるまで、コードの一部を追加してみてください。

于 2012-07-04T01:48:01.517 に答える
1

まず、インスタンスの CPU 使用率が 45 ~ 60% になることはおそらく望ましくありません。その場合、トラフィックが急増すると、すべてのインスタンスが停止します。

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

より保守的な設定では、インスタンスごとに 4 つほどの Unicorn プロセスを使用し、1 秒あたり 5 ~ 8 のリクエストに応答する場合があります。次に、CPU 使用率が約 35% になるまでインスタンスの数を調整します。これにより、ストレスの多い「1 秒あたり 20 リクエストのシナリオ」での安定性が確保されます。

最後に、 を使用して、より詳細な統計と詳細を取得できますGod

于 2012-06-25T03:21:57.680 に答える