は、私たちは、アプリの無関係な部分では、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%を超えることはめったにありませんが、実行中のタスクが多数あり、プロセスによって使用されているスレッドがあります。
IO/CPUの全体的なアクティビティをプロファイリングして、単純にボックスをペグしているかどうかを確認しましたか? –
私はまた、ここでブロックするという複雑な問題があるのだろうかと思っていますが、それは孤立して調べるのが非常に難しいです。 –
これはスレッド数が150であるためです。それらが「ビジー」スレッドであり、コアでしばらく競合していると、予定通りにスラッシングするだけで多くの時間が無駄になります。これらのスレッドは何をしていますか? TPLループの最大スレッド数を制限してみてください。 –