3

処理が必要な約10個のキューにデータをスローするワーカーロールが1つあります。大量のデータがあります。おそらく、1秒間に約10〜100のメッセージが、さまざまなキューにキューイングされます。

キューは異なるデータを保持し、それらを別々に処理します。特に非常にアクティブな単一のキューがあります。

私が今設定している方法では、10個の異なるスレッドを生成する個別のワーカーロールがあり、各スレッドはwhile(true){キューからメッセージを取得して処理する}を持つメソッドを実行します。キュー内のデータがバックアップされるたびに、これらのプロセスをさらに起動するだけで、キューからのデータの処理を高速化できます。また、1つのキューがよりアクティブであるため、実際には、同じメソッドを指す多数のスレッドを起動して、そのキューからのデータを処理します。

ただし、展開のCPU使用率が高いことがわかります。ほぼ100%またはほぼ常に。

これはスレッドの枯渇によるものなのだろうか?または、キューへのアクセスがRESTfulであり、接続を実行して処理速度を低下させることにより、スレッドが相互にブロックすることになりますか?または、私が使用しているためですか?

while(true)
{
   var message = get message from queue;
   if(message != null)
   {
       //process message
   }
}

そして、それはあまりにも速く実行されますか?

メッセージを処理するたびに、メッセージはAzure Table StorageまたはDBにも保存されるため、CPUを消費しているのはこのデータを保存するプロセスである可能性があります。

事実上、高いCPU負荷をデバッグすることは非常に困難でした。ですから、私の質問は次のとおりです。発生する可能性のある問題を軽減および防止するのに役立つ、一般的なアーキテクチャの変更はありますか?(たとえば、while(true)を使用して別のタイプのポーリングを使用する代わりに、この例では最終的に同じだと思いますが)。

たぶん、単にnew Thread()を使用して新しいスレッドを生成することは、最善の方法ではありません。

4

5 に答える 5

10

ループにsleepステートメントを入れることをお勧めします...そのタイトなループはおそらくCPUリソースを占有しているだけでなく、ストレージトランザクションの費用もかかります。キューを1万回チェックするごとに、1ペニーの費用がかかります。これは少額の費用ですが、時間の経過とともにかなりの額になる可能性があります。

私もよくこのようなコードを使用しました:

while(true) { var msg = q1.GetMessage(); if (msg != null) { ... } msg = q2.GetMessage(); if (msg != null) { ... } }

つまり、キューを並列ではなく直列にポーリングします(これは完全に単語である必要があります)。そうすれば、実際には一度に1つのことだけを実行しますが(タスクがCPUを集中的に使用する場合に便利です)、各ループのすべてのキューをチェックします。

于 2010-11-03T06:28:57.247 に答える
3

CPUでも同じ問題がありました。これは、Azureキューの非効率的なローカル実装が原因である可能性があります。

最後に、指数関数的なスリープポリシーを追加しました(実装用-Lokad.CQRS for Azureプロジェクトで確認してください)。キューは頻繁にポーリングされますが、どちらにもメッセージがない場合は、スリープ間隔が到達するまで徐々に増やしていきます。いくつかの上限。メッセージが検出された場合、間隔をすぐに削除します。

このように、システム全体でストレージトランザクション(およびローカル開発CPU)を浪費することはありませんが、複数のメッセージが連続して送信された場合でも、非常に応答性が高くなります。

于 2010-11-03T06:33:35.113 に答える
2

BrianHitneyによるScalingDownAzureRolesビデオをご覧ください。基本的なアプローチは、いくつかのスレッドを生成することです。各スレッドには、特定のキューを監視して適切に動作する「ワーカー」があります。特に、これにより、1つのキューが他のキューをブロックするのを防ぎます。

于 2010-11-04T12:38:16.237 に答える
1

あなたの問題はループの実装に起因すると思います。ポーリングは、sleep()のようなものによって遅くする必要があります。それ以外の場合、ループが100%CPUコアを消費することを妨げるものは何もありません(これは実際には通常の動作です)。

于 2010-11-03T09:10:24.463 に答える
1

このすべてをカバーする素晴らしいMSDNの記事があります

MSDN-WindowsAzureでのキューベースのメッセージングソリューションのスケーラビリティと費用対効果を最大化するためのベストプラクティス

やるべきことがあるときにスレッドとインスタンスを追加し、ないときにバックオフすることで、複数のスレッドとインスタンスからキューを継続的かつ不必要にポーリングしたり、トランザクションコストを増やしたり、CPUをヒーターに変えたりすることについて説明します。一定の100%のCPU使用率。

于 2012-06-15T09:01:11.010 に答える