ランナーXをお試しくださいスレッド8すべて終わったn分。
以下を使用して同じプログラムを実行してみてください。スレッド50すべて終わったn*10分。
なぜこれが起こるのか、そして利用可能なスレッドの最大数を取得するにはどうすればよいですか?
答え1
「なぜこのようなことが起こるのでしょうか?」答えは簡単です。 4人が並んで座れる廊下があると想像してみてください。すべてのゴミを一端から他端に移したいです。最も効率的な人数は4人です。
1~3人がいると廊下スペースを使う余裕がありません。 5人以上の場合、そのうち少なくとも1人は基本的に他人の後ろに並んで待っています。より多くの人を追加すると、廊下が塞がれ、活動が速くなりません。
したがって、キューを引き起こすことなくできるだけ多くの人を収容したいと思います。 なぜキュー(またはボトルネック)があるかどうかは、slmの回答の質問によって異なります。
答え2
質問した内容は複雑です。スレッドの特性についてもっと知らないと言うのは難しいです。システムのパフォーマンスを診断する際に考慮すべき事項は次のとおりです。
プロセス/スレッドです
- CPU制限(かなりのCPUリソースが必要)
- メモリ制限(大量のRAMリソースが必要)
- I/O制限(ネットワークおよび/またはハードドライブリソース)
3 つのリソースはすべて制限されており、1 つのリソースがシステムのパフォーマンスを制限します。特定の状況でどちらが消費されるかを知る必要があります(おそらく2または3)。
ntop
と をiostat
使用して、vmstat
何が起こっているかを診断できます。
答え3
一般的な推奨事項はn + 1スレッドです。ここで、n は使用可能な CPU コアの数です。これにより、n個のスレッドがCPUを使用でき、1個のスレッドがディスクI / Oを待っています。少数のスレッドはCPUリソースを完全に活用できず(ある時点では常にI / O待機があり)、スレッド数が多いとスレッドがCPUリソースを離して競合することになります。
スレッドは無料ではありませんが、コンテキスト切り替えやスレッド間でデータを交換する必要がある場合(よく発生する場合)、さまざまなロック機構などのオーバーヘッドがあります。これは、実際にコードを実行するための専用CPUコアが多い場合にのみ価値があります。シングルコアCPUでは、シングルプロセス(別々のスレッドなし)は通常、すべてのスレッドよりも高速に完了します。スレッドは魔法のようにCPUの実行速度を上げるのではなく、追加の作業を意味するだけです。
答え4
ここで犯人は「コンテキスト切り替え」でなければなりません。別のスレッドの実行を開始するために現在のスレッドの状態を保存するプロセス。複数のスレッドに同じ優先順位が付与されている場合は、実行が完了するまで切り替える必要があります。
あなたの例では、50個のスレッドがある場合、10個のスレッドのみを実行するよりも多くのコンテキスト切り替えが発生します。
コンテキスト切り替えによる時間オーバーヘッドにより、プログラムが遅く実行されます。