web-dev-qa-db-ja.com

ThreadPool SetMaxThreadsおよびSetMinThreadsマジックナンバー

ThreadPoolのSetMaxThreadsおよびSetMinThreadsの値を設定するためのマジックナンバーまたは式はありますか?何千もの実行時間の長いメソッドを実行する必要がありますが、これらの値を設定するための完全な一致を見つけることができません。任意のアドバイスをいただければ幸いです。

31
Benny

デフォルトの最小スレッド数は、マシンにあるコアの数です。これは良い数値です。コアよりも多くのスレッドを実行することは、一般的に意味がありません。

スレッドのデフォルトの最大数は、.NET 2.0 SP1以降のコア数の250倍です。ここには大量の呼吸室があります。 4コアマシンでは、どのスレッドも妥当な時間内に完了しない場合、その最大に達するまで499秒かかります。

スレッドプールスケジューラは、アクティブなスレッドの数を最小限に制限しようとします。デフォルトでは、コアの数です。 1秒に2回、アクティブなスレッドが完了しない場合に、もう1つのスレッドを開始できます。非常に長時間実行されるスレッドや、I/Oが原因ではない多くのブロッキングを実行するスレッドは、スレッドプールの候補としては適していません。代わりに通常のスレッドを使用してください。

最大限に達することは健康ではありません。 4コアマシンでは、これらのスレッドのスタックだけがギガバイトの仮想メモリ空​​間を消費します。 OOMを取得する可能性が非常に高いです。問題がある場合は、スレッドの最大数を減らすことを検討してください。または、スレッドセーフキューから作業パケットを受信する通常のスレッドをいくつか開始することを検討してください。

46
Hans Passant

通常、マジックナンバーはそれをそのままにすることです。 ThreadPoolはこれをうまく処理します。

そうは言っても、長時間実行するサービスを多数実行している場合、およびこれらのサービスは待機している期間が長くなるため、より多くのオプションを処理するために最大スレッド数を増やすことができます。 (プロセスがブロックしていない場合は、スレッド数を増やすと、おそらく遅くなるだけです...)

アプリケーションをプロファイリングして正しい番号を見つけます。

8
Reed Copsey

より適切な制御が必要な場合は、組み込みのThreadPoolを使用しないことを検討してください。 http://www.codeproject.com/KB/threads/smartthreadpool.aspx に素敵な代替品があります。

6
Michael Bray