1

私は、数百のワーカーを並行して使用するシステムに取り組んでいます (小さなタスクを評価する物理デバイス)。一部のワーカーは他のワーカーよりも高速であるため、事前に速度を知らなくてもタスクの負荷を分散する最も簡単な方法を考えていました。

ワーカーが現在取り組んでいるタスクの数を単純なカウンターで追跡し、リストを並べ替えて、アクティブなタスク数が最も少ないワーカーを取得することを考えていました。このようにして、遅いワーカーはいくつかのタスクを取得しますが、システム全体を遅くすることはありません. 私が質問している理由は、現在のラウンド ロビン方式では、タスクを蓄積し続けて新しいタスクをブロックし続ける非常に遅いワーカー (他のワーカーよりも 100 倍遅い) が滞っているからです。

現在アクティブなタスクの数に従ってリストをソートするのは簡単なことですが、リストを1秒間に数回ソートすることになるため(タスクあたりの平均作業時間は25ミリ秒未満です)、これが大きなボトルネックになるのではないかと心配しています. 何度も何度も並べ替えることなく、タスク数が最も少ないワーカーを取得する簡単なバージョンがあります。

EDIT : タスクは、開いている TCP 接続を介してワーカーにプッシュされます。タスク間の依存関係はかなり複雑 (排他的なリソース使用) であるため、すべてのタスクが最初から割り当てられているとしましょう。タスクがワーカーから戻るとすぐに、ブロックされていないすべてのタスクがキューに入れられ、新しいタスクがワーカーにプッシュされます。ワーク キューが空になることはありません。

4

2 に答える 2

1

このシステムはどうですか:

  • ワーカーがタスク キューの最後に到達する
  • ワーカーがロード バランサーに追加のタスクを要求する
  • ロード バランサは N 個のタスクを割り当てます (N はおそらく 1 より大きく、これらのタスクが非常に小さい場合は 20 ~ 50 です)。

このシステムでは、作業員が実際に作業を終えたときに新しいタスクを割り当てるため、残りのタスクにかかる時間を推測する必要はありません。

于 2012-02-08T22:05:11.020 に答える
0

システムに関する詳細情報を提供する必要があると思います。

ワーカーにタスクを渡すにはどうすればよいですか? ワーカーはそれを要求しますか、それともプッシュされますか? 労働者が失業しているかどうか、または労働者がどれだけの仕事をしているかさえ、どのようにして知ることができますか? 物理デバイスはどのようにモデル化されていますか?

あなたがしたいことは、何かを追跡することを避け、作業を分散するためのより受動的な方法を見つけることです.

于 2012-02-09T00:49:26.273 に答える