2011-03-09 13 views
7

私は自分の娯楽のために、極限までいくつかの限界を押し込もうと試みています。スレッドプールのデフォルトは25スレッドになっており、MSDNによれば1000までプッシュすることができます。しかし、CPUコアあたりのスレッドの実際的な制限は何ですか?ある時点では、コンテキストの切り替えによってスレッドの保存よりもボトルネックが増えます。誰もこれをカバーするベストプラクティスを持っていますか? 100、200、500と話していますか?それはスレッドが何をしているかによって異なりますか?フレームワークが命令するアーキテクチャ以外に、CPUコアごとに最適なスレッド数が決まるのは何ですか?CPUあたりのスレッドの実際の制限はいくらですか?

+7

http://stackoverflow.com/questions/1718465/optimal-number-of-threads-per-core - これは、ここで回答を待つ間にいくつかのクエリに答えるかもしれません:) – dotalchemy

+0

@dotalchemy - 感謝、逸話情報は通常ですかなり役に立ちました。そこにいくつかの良い洞察があった。誰かがベストプラクティスに関する情報を得ているかどうかは興味深いでしょう。 – BobTheBuilder

+0

42.もちろん... –

答えて

8

それはスレッドの処理内容に依存します。それらがCPUに束縛されている(無限ループで緊密に座っている)場合、コア当たり1つのスレッドがCPUを飽和させるのに十分である。それ以上あれば(そして、あなたは既にバックグラウンドプロセスなどから多くのものを持っています)、あなたは競合を始めます。

スレッドが実行に適さない場合(たとえば、いくつかの同期オブジェクトでブロックされている場合)、あなたが持つ可能性があるスレッドの数の限界は、CPU以外の要素(スタック、 OSの内部制限など)。

7

あなたのアプリケーションが(大部分のように)CPUに束縛されていない場合は、コンテキストスイッチが重要です。なぜなら、アプリケーションが待機するたびにコンテキストスイッチが必要になるからです。スレッドが多すぎるという問題は、OSのデータ構造と、スレッドが同期アルゴリズムのランダム性のために実行する機会を得られない(またはごくまれに)飢餓のようないくつかの同期異常です。

アプリケーションがCPUにバインドされている場合(99%の時間がメモリで処理されている、まれにI/Oを実行している、またはユーザー入力や別のスレッドなどの何かを待っている場合)、最適なのは1論理スレッドあたり1スレッドこの場合、コンテキストの切り替えは行われないためです。

複数のCPUに1つのスレッドしかない場合でも、OSは毎回スレッドに割り込むことに注意してください。 OSはスレッドを割り込みだけでなくスレッド管理目的(タスクマネージャに表示するようにカウンタを更新する、スーパーユーザが削除するなど)にも割り込みをかけます。

+0

ソケットデータを受信して​​、何らかの記述のデータベースに高速に送信するなど、通常の業務用の処理をしているとしましょう。理論的には、.NETは本当の意味ではI/Oを処理しません.SqlBulkCopyをSQL Serverにダンプすることができます。 – BobTheBuilder

+0

OSを動かすだけで、すでにたくさんのスレッドが浮遊しています。コアごとに1つのスレッドが最適ですが、現実には決して起こりません。コアあたりのスレッドの最適数が何であるかを知ることが重要であることがわかりません。あなたのアプリだけが走っているわけではありません。 –

+2

@Joel Gauvreau好奇心を呼んでください。そういうわけで私たちが最初にこの仕事に就いたのはなぜですか?知識と理解のための渇き...私の答えは "知るべきポイントは何ですか?" 「ただ知っている」 – BobTheBuilder

関連する問題