2

Azureコードに対してVisualStudio2010スレッドプロファイラーを実行したところ、多くの競合が発生していることに気付きました。私のコードは実行中よりも頻繁にブロックされます!

私のワーカーには、カスタムスレッドロジックがまったくありません。これは単純なWhileループであり、さまざまなキューに作業があるかどうかを尋ねます。QueueRepositoryClassのインスタンスを作成してから、GetQueueMessage関数を呼び出します。

何らかの理由で、複数のスレッドがGetQueueMessageメソッドにヒットし、同じqueueClientインスタンスを使用しているようです。おそらくそれは私がCloudStorageAccountオブジェクトを押しつぶした結果ですか?それとも、CreateCloudQueueClient拡張メソッドですか?

4

2 に答える 2

3

呼び出し元のコードが表示されない場合、これは部分的に推測ですが、かなりタイトなループでGetMessage()を呼び出しているように見えます。GetMessageは同期呼び出しです。そうすることで、キューからの応答を待機している間、その特定のスレッド自体がブロックされます(他のスレッドは引き続き実行されます)。プロファイラーでは、これは非常に速く見えますが、残りのループロジックは非常に高速に実行されます(つまり、コードの実行に1〜2ミリ秒かかり、メッセージの取得に50ミリ秒かかると、まったく同じようになります)。

もう1つの注意点として、いくつかの理由から、タイトループでキューをクエリする場合は注意が必要です。

1)Txあたりの料金は小さいですが、0ではありません。通常はバックオフロジックをお勧めします。つまり、キューが空の場合は、100ミリ秒待ってから再度チェックします。2回空にしたり、500ミリ秒に戻したりします。明らかに、目的のユーザーエクスペリエンスとのバランスを取る必要があります。

2)アプリケーションをスケーリングすることになった場合、キューに対してDoS攻撃を効果的に作成します。タイトなループでキューをドキドキする100個のインスタンスはすべて、パフォーマンスを実際に損なう可能性があります。

パット

于 2010-07-27T18:42:07.143 に答える
0

Async QueueClientメソッドを使用するように切り替えたところ、システム全体のパフォーマンスが大幅に向上しました。

于 2010-07-27T23:24:15.733 に答える