web-dev-qa-db-ja.com

ワークロードバランス/タスク分散アルゴリズム

負荷分散のジャンプポイントとして使用するアルゴリズムを探しています。

環境:ユーザーがいつでもスケジュールできる〜7のジョブタイプがあります。一部のジョブは高速で、他のジョブは低速です(多くのデータ処理)。スケジュールされたジョブを検出して実行する「ジョブプロセッサ」の単一インスタンスがあります。 「ジョブプロセッサ」は一度に最大5つのジョブ「スレッド」を実行します。

問題は、1つのジョブが他の4つのジョブが処理されないほど多くのリソースを消費する可能性があり、さらに悪いことに、他のスケジュールされたジョブが長時間遅延することです。

一部のジョブは、「すぐに実行する」ようにスケジュールできるため、次の行に進みます。

解決策:「ジョブプロセッサ」のインスタンスをさらに追加します。大きなVMサーバーがあり、ITがこの「ジョブプロセッサ」のインスタンスを処理するためにそれぞれ3つのVMを展開しています。

デフォルトでは、それは役立つでしょうが、私はそれの背後にもっと考えるべきだと思います。

私の解決策:「ジョブプロセッサ」を水平方向にスケーリングすることに加えて、インスタンスの現在の負荷に基づいてインスタンスが取得するジョブを決定し、バイアスを可能にする方法が必要だと思います。

各ジョブタイプ(平均実行時間など)の統計を決定し、1〜5のスコア(5は長時間実行)を与えることをお勧めします。各インスタンスは、現在実行中のジョブの合計スコアに基づいて現在の負荷が何であるかを判断し、そのバイアスを考慮に入れます。たとえば、インスタンスを小さなジョブに偏らせるように設定して、別のインスタンスが中程度のジョブに偏るなど、大きなジョブを回避できるようにすべきだと思います。

これについてのアドバイスを探しています。ジョブは、大量の時間、CPU、メモリを消費する可能性があります。私の目標は、スケジュールされたジョブキューを可能な限り迅速に移動させながら、各インスタンスが実行可能な作業のみをプルダウンするようにすることです。

他の開発者の1人は、「ジョブプロセッサ」をそのままにして、次のキューまたは「ラウンドロビン」にあるものを単にプルすることを提案しました。これは、単一のインスタンスがあまりにも多くの大きなジョブをプルダウンし、他のインスタンスがアイドル状態のときにそれらを完了するのに苦労しているという潜在的な問題につながる可能性があると私は言います。

7
DustinDavis

あなたが探しているものの一部は、「 優先キュー 」です。以前の雇用主では、これの非常に原始的なバージョンを実行しましたが、私のヒューリスティックは、一部のプロセッサに短時間実行ジョブ(短時間のジョブは数分かかる可能性があります)のみを許可し、他のプロセッサは長時間実行ジョブの処理を許可することでした(四半期レポートはほぼ2処理する日数)。これにより、短いジョブが常に処理時間を利用できることが保証されました。また、実行の準備ができているジョブを一覧表示するスコアボードを使用しました。タスクを処理できる最初のプロセッサがそれを取得して、シングルスレッドで実行しました(これらは、減価償却が行われていないため破棄できない安価なコンピューターです)。多くの人々はその逆を使用します。つまり、プロセッサに次に実行する作業単位を指示するスケジューラです。私のアドバイスは、各インスタンスで単一のタスクを実行することです。これにより、スケジューリングが大幅に簡略化されます。

任意の長さの任意のジョブのスケジューリングは、分散処理では難しい問題です。ほとんどすべての決定は、多くの実行をシミュレートすることを含みます。これはキューイング理論の特徴の1つであり、これはこれに基づいています。

他の開発者の1人は、「ジョブプロセッサ」をそのままにして、次のキューまたは「ラウンドロビン」にあるものを単にプルすることを提案しました。これは、単一のインスタンスが非常に多くの大きなジョブをプルダウンし、他のインスタンスがアイドル状態のときにそれらを実行するのに苦労しているという潜在的な問題につながる可能性があると言います

これには答えるシミュレーションが必要です。私の以前のスキームは、非常によく似たものを使用していました。以前のジョブの実行に関する統計がある場合は、Excelでモデル化できます。私は この本 を推奨する別の投稿からピックアップしました。そして、あなたが説明しているような問題により適切に答えられるようにするためにいくつかのテクニックを学びたいと思っています。実際の数値はすべてに勝るので、データを収集し、それらに基づいてシミュレーションを実行します。

2
Tangurena

あなたの推論はしっかりしていて、あなたのアイデアは良いし、友達のアイデアも十分だと思います。

おそらく、「前処理」プロセスも検討する必要がありますか?

ジョブが非常に時間がかかり、キューで不要な待機時間が発生している場合、単一の大きなジョブを一連の小さなジョブに分割して、親プロセスのステージングテーブルにデータを前処理している可能性があります。

個々のジョブのコストを下げて、平均処理時間の差異を大幅に減らすことは、ランキングシステムのかなりの代替手段になります。

編集:ジョブごとの時間から導出されたランキングシステムは、環境固有の変数の影響を大きく受ける可能性があることにも注意してください(たとえば、 RAID構成には、ソリッドステートHDDが搭載されたサーバーでは意味のあるランクがない場合があります。

これは、単一環境のパフォーマンスに基づいてランクを決定する際の落とし穴になる可能性があります。

2
maple_shaft

「ジョブプロセッサ」のインスタンスをさらに追加します。大きなVMサーバーがあり、ITがこの「ジョブプロセッサ」のインスタンスを処理するためにそれぞれ3つのVMを展開しています。

正しい。

デフォルトでは、それは役立つでしょうが、私はそれの背後にもっと考えるべきだと思います。

不正解です。

これ以上のエンジニアリングは時間の無駄です。

ユースケースを詳細に検討してください。

シングルプロセッサキューでは、実行時間の長いジョブが最初に1つだけのプロセッサに入ります。他のジョブは待機します。あなたはこれが好きではありません。

マルチプロセッサキューでは、実行時間の長いジョブがいずれかのプロセッサに入り、他のプロセッサは解放されます。問題が解決しました。

同時に開始できる3つの長時間実行ジョブがあるとします。次に、ワークロードを処理するには4つのプロセッサが必要です。 3つは長期実行ジョブを取得し、4つ目は「即時」ジョブを処理します。

単一のリクエストキューで動作する複数のプロセッサが、広く採用されているほぼ普遍的な標準ソリューションです。これ以上何も必要ありません。

本当に、本当に優先順位が重要だと思う場合は、FIFOキューの代わりに優先順位キューを使用し、簡単な優先順位を手動で割り当てます。考えすぎないでください。時間の無駄になります。

2
S.Lott