web-dev-qa-db-ja.com

ハイパースレッディングを使用するサーバーでの計算集約型タスクに最適なスレッド数

ハイパースレッディングを備えたInteli7クアッドコアプロセッサを搭載したサーバーで計算集約型のタスクを実行する場合、8つのスレッド(8つの仮想コアの場合)または4つのみ(4つの物理コアの場合)を実行するのが理想的ですか?各スレッドは、仮想コアの一貫した100%の使用率を実現します。

2
Will Johnson

結果の結合などで大きな追加のオーバーヘッドがないと仮定すると、8スレッドが理想的です。スレッドが4つしかない場合、仮想コアごとに1つのスレッドで飽和させることができなかった実行ユニットは無駄になります。 8スレッドで使用できます。

これは、各スレッドがコアを飽和させる可能性があるという非現実的な仮定にのみ適用されることに注意してください。また、プロセッサキャッシュリソースの分割がパフォーマンスに悪影響を及ぼした場合は、適用されない可能性があります。一部のタスクには、特定のキャッシュサイズで「崖から落ちる」パフォーマンスがあります。崖が物理コアのフルキャッシュサイズとそのキャッシュサイズの半分の間にある場合は、4つのスレッドの方が適している可能性があります。

2
David Schwartz

doctrineコンパイル時にコア数の1.5倍であると教えられました。これは、スレッド/プロセスがI/Oを待機しているときのことです。

I/Oなどの低速の操作でタスクがブロックされる可能性がない場合は、コアの数を超える必要はないかもしれませんが、可能であれば、コアよりも多くのプロセスが必要になります。

このように見てください。4つのコアと3つのプロセスがある場合、100%のCPUを達成することはできません。 4つのプロセスの1つがI/Oでブロックしている場合も、同じことが言えます。ブロッキングのない6つのプロセスがある場合、カーネルが4つのコアのオンとオフでプロセスをスワップするCPU時間を消費するため、効率が少し低下する可能性がありますが、コアがアイドル状態になることはありません。

残念ながら、私はあなたの質問の物理的/仮想的側面についてはわかりません。

0
Ladadadada

私の推測では、コアごとに1つのタスクを使用し、ハイパースレッディングを無効にするのが最適です。

論理コアと同じ数のCPU集約型スレッドを開始すると、CPU集約型タスクのコンテキストスイッチは高速になりますが、ハイパースレッディングはCPU集約型タスクによって完全に消費されるため、バックグラウンドタスクのコンテキストスイッチは高価になります。一方、物理コアと同じ数のCPUを集中的に使用するスレッドを開始すると、それらのタスクへのコンテキストスイッチはなく、バックグラウンドタスクへの高速コンテキストスイッチもありません。良さそうですが、バックグラウンドタスクは無料の論理プロセッサを見つけ、ほぼ仲介して実行されます。まるでリアルタイムのパフォーマンスのようです(ニース-20)。

同じコア上の2つのタスク間のコンテキストスイッチの速度がわかりません。また、同じコア上の2つのスレッド間でキャッシュを共有することにより、キャッシュのヒット頻度が低下するのではないかと心配しています(1 MB未満のプログラムを実行している場合を除く)。罰則がないのではないかと思います。私の直感では、複雑なCPUを集中的に使用するタスクは、仮想プロセッサごとに1つのタスクよりも、コアごとに1つのタスクで高速に実行されます。ただし、これを行うと、2つの仮想プロセッサが空いたままになり、バックグラウンドタスクが優先されます。

最初のシナリオでは、ハイパースレッディングはusellesですが、通常の処理でハイパースレッディングを最大限に活用したため、バックグラウンドタスクは高価なコンテキストスイッチを使用します。 2つ目は、CPUパワーの最大50%がバックグラウンドタスクに優先されるため、受け入れられません。

私は通常、Intelデスクトップとサーバーでハイパースレッディングを無効にします。 https://serverfault.com/a/720471/309821 でその方法を示します。

しかし、これは当て推量に基づいています。良い印象がありますが、そうではないかもしれません。

0
Lucas