2011-01-11 15 views
1

は、私たちは、アプリの無関係な部分では、WCFサービスの数をホストし、Windowsサービスは、非同期的に仕事の比較的短いビットを行うにはTPLTaskクラスを多用しています。CLR ThreadPoolのビジーワーカースレッド数がI/Oスレッドのパフォーマンスに影響しますか?

WCFが要求を実行するためにThreadPoolから管理されたI/Oスレッドを使用するのは私の理解です。私は、アプリケーションの使用を大幅に向上させた機能を展開した後、ThreadPoolワーカースレッドの使用も同様に、2つのWebサービスのパフォーマンスが非常に遅くなっていることに気付きました。我々は1秒未満ではなく分を話している。実際に一度に実行しようとしているTasksの数は20〜1000の範囲になる可能性があります。これにより、CPU時間を必要とする新しい(最後の)作業がかなりの時間待たれることがあります。

ThreadPoolの管理されたI/Oスレッドに影響を与えるThreadPoolワーカースレッドが(私の場合は非常に大きい)多数ありますか?これらの2つは何らかの方法で接続できますか?または、私は他の場所を探し始める必要があります...

ありがとう!

EDIT:かなり典型的な長時間実行されているWebサービスの1呼び出そうとしながら、私はアプリのライブ展開にスポットチェックをした:70個のタスクが実行されているが、Windowsサービスのプロセスは、約150のスレッドがあり、平均CPU使用率は30〜60%です。典型的には、CPU使用率は一般的に約40%で、80%を超えることはめったにありませんが、実行中のタスクが多数あり、プロセスによって使用されているスレッドがあります。

+0

IO/CPUの全体的なアクティビティをプロファイリングして、単純にボックスをペグしているかどうかを確認しましたか? –

+0

私はまた、ここでブロックするという複雑な問題があるのだろうかと思っていますが、それは孤立して調べるのが非常に難しいです。 –

+0

これはスレッド数が150であるためです。それらが「ビジー」スレッドであり、コアでしばらく競合していると、予定通りにスラッシングするだけで多くの時間が無駄になります。これらのスレッドは何をしていますか? TPLループの最大スレッド数を制限してみてください。 –

答えて

1

注:私はこれまでに自分の質問に答えたことはありません。コメントや意見の相違は自由ですが、他の誰かから回答が得られないように見えます。

私たちのパフォーマンス上の問題の原因となる問題は、まったく無関係なものであり、現在解決されています。

これが解決された後、Webサービスは適時に応答し始めました。これにより、TPLタスクを同時に実行することができます(私の例では数百のように)。スレッドプールワーカースレッドを頻繁に使用しても、WCFはスレッドプールの管理対象Iを使用することができます/ Oスレッドを使用してWebサービス要求を効率的に処理します。

1

タスクがスリープ状態またはI/Oを待つ時間を過ごす場合は、TaskCreationOptions.LongRunningを使用してタスクを開始すると便利です。 これにより、キューに入れられたスレッドが完了するのを待つのではなく、スレッドプールがより多くのスレッドを作成します。

task = Task.Factory.StartNew(() => 
    { 
     DoLongRunningWork(); 
    }, TaskCreationOptions.LongRunning); 

あなたは概念をテストしたい場合は、あなたが役に立つかもしれません実験hereがあります。

関連する問題