Ruby on Rails Webcorn app under Unicorn)を実行しています。このアプリは厳密にはCPUにバインドされていません(12コアのデュアルXeon E5645システムとピーク負荷平均値は約6です。最初は40個のUnicornワーカーから始めましたが、時間の経過とともにアプリケーションメモリのフットプリントが増加しました。そのため、ワーカープロセスの数を減らす必要があります。標準(CPUコアの数+ 1 )式はUnicornにも適用されますが、私の同僚はCPUごとにより多くのUnicornインスタンスを予約する必要があると私に納得させようとしました this link 。しかし、なぜ多くのメモリを費やす必要があるのか正確にはわかりませんアイドル状態のUnicornプロセス。
私の質問は、CPUコアごとに複数のUnicornインスタンスが存在する理由は何ですか?それは、ユニコーンの構造上の特徴によるものですか?忙しいUnicornプロセスは新しい接続を受け入れられないことを認識しています(UNIXドメインソケットを使用して、Unicornインスタンスと通信しています)が、これに対処するためにバックログが正確に導入されたと思いました。とにかく、CPUルールごとにこの2〜8個のUnicornインスタンスを克服することは可能ですか?
さて、ようやく答えを見つけました。 Unicornワーカーの最適な数は、CPUコアの数に直接関係しているわけではなく、負荷とアプリの内部構造/応答性によって異なります。基本的に、サンプリングプロファイラーを使用してワーカーの状態を判断し、70%をアイドル状態に、30%を実際の作業に使用するようにしています。したがって、サンプルの70%は「select()呼び出しでフロントエンドサーバーからリクエストを取得するのを待っている」はずです。私たちの調査によると、労働者の有効な状態は3つだけであることがわかりました。アプリケーションの応答性が大幅に変化しないため、それは本当の意味ではありません)。 0〜30%の状況を「レッドゾーン」、30〜50%の状況を「イエローゾーン」と見なします。
CPUにバインドされたジョブについては、N + 1についてはあなたの言う通りです。
一方、Unicornはスレッドを使用しないため、すべてのIO op。はプロセスをブロックし、別のプロセスがHTTPヘッダーを起動して解析し、文字列を連結して、CPUを集中的に必要とするすべてのタスクを実行します。ユーザーにサービスを提供する(リクエストのレイテンシを減らすために早く実行する)。
また、コアよりも多くのスレッド/プロセスが必要になる場合があります。以下の状況を想像してみてください。 Aはreqの10倍以上かかります。 B、いくつかの同時A要求があり、高速B要求はA-reqが完了するのを待つだけでキューに入れられます。したがって、重い要求の数を予測できる場合は、この数を別のガイドラインとして使用してシステムを調整できます。