0

ワーカータスクを自動スケーリングする方法は?

処理するアイテムのスループットに対応するためにワーカータスクの数を自動的にスケーリングしたいアプリケーションがあります(明らかにワーカー数の上限があります)。

処理するすべてのアイテムは単一のポイントを経由してルーティングされ、そこからワーカータスクに分散されます(現在、キューが最も短いワーカーを見つけて、アイテムをキューに入れます)。

アイテムを処理するために何人のワーカーをスピンアップする必要があるかについて、インテリジェントな決定を行うために使用するのに適したパターンまたは手法は何でしょうか。このロジックには、より少ないワーカーでアイテムをタイムリーに処理できる場合に、ワーカーをシャットダウンすることを含める必要があります。

最終的に他のリソースがボトルネックになるため、ワーカーを追加しても無限に拡張できるわけではなく、ある時点でワーカーを追加すると、助け以上に害が生じることを理解しています。これを考慮して、「スイートスポット」を自動的に見つけるためにワーカーの数を減らすことにした場合、それは素晴らしいことですが、この時点で、システムがワーカーの数を次のように増やすことができれば幸いです。より多くのアイテムが追加され、必要なアイテムが少なくなるにつれて数を減らします。

私がいじくり回したアイデアの1つは、アイテムがキューにある平均時間を測定することです。この平均時間が数秒を超える場合は、(設定された最大制限に達するまで)より多くのワーカーを起動する必要があります。平均時間が1秒未満の場合は、より多くのワーカーをスピンダウンする必要があります(もちろん残りが1つになるまで)。

誰かがこれに取り組むための最良の方法について何か提案がありますか?

4

2 に答える 2

0

ワーカー間で分散できるチャンクに作業を分割できない限り、スケーリングすることはできません。その作業をどのように分配するかは、作業をどのように分割するかによって異なります。作業を小さなチャンクに分割し、完了時に結果がマージされる場合、マップ/リデュース パターンは法案に適合する可能性があります...

何をするにしても、CPU よりも多くのスレッドを実行するとすぐに、パフォーマンスが劇的に低下することに注意してください。これは、非常にコストがかかるコンテキスト切り替えを増やしたり導入したりするためです。TPL や PLINQ などを使用すると、タスクをスケジュールしてこの問題を回避できます。

于 2012-06-08T20:28:18.740 に答える