1

各スレッドが各コアで実行されるマルチスレッドプログラムのLinuxでCPUアフィニティを設定すると、他のプロセスがそのコアのOSによってスケジュールされるのを効果的にブロックできます。事実上、プロセスでのコアの使用を保証し、他のすべての重要ではないプログラムを最小限の数のコアにバインドしたいと考えています。

または、Linuxスケジューラーで何かが足りないのでしょうか、それとも自分で何かが必要なのかもしれません。

4

2 に答える 2

4

LinuxでマルチスレッドプログラムのCPUアフィニティを設定できます。このプログラムでは、各スレッドが各コアで実行され、他のプロセスがそのコアのOSによってスケジュールされるのを効果的にブロックします。

いいえ、CPUアフィニティを設定すると、スケジューラがスレッドに一部のコアを使用できなくなります。つまり、特定のコアでスレッドをスケジュールするだけで、他のスレッドには何もしません。

を使用して、おそらく目的を達成できますsetpriority。要件がそれほど厳しい場合は、またはを調べてsched_setscheduler選択することができます。SCHED_RRSCHED_FIFO

于 2012-06-04T06:38:18.220 に答える
1

スケジューラが積極的に関与している場合、taskset と nice はスケジューラに好みに関するヒントを与えるだけです。スケジューラは、ワークロードに基づいて、使用可能なコアのスレッドを自由に再スケジュールできます。perfを使用して、コンテキストの切り替えと CPU の移行を監視できます。

次の 2 つのオプションがあります。

  1. user417896 が提案したように、sched_setscheduler を介してスケジューラーが注文に従うように強制できます。
  2. cgroups/cpuset を使用して、たとえばsystemisolatedという 2 つの cpuset を定義し、すべてのシステム スレッドをシステムcpuset に移動してターゲット コアを分離し、分離された cpuset で cgexec を使用してプログラムを実行できます。コアとメモリを cpuset に割り当てることができ、それを分離するために cpu_exclusive ビットを設定すると、すべて設定されます。このプロセスを自動化するために古いカーネルを使用している場合は、cset (http://code.google.com/p/cpuset/ ) も使用できます。

お役に立てば幸いです。

于 2012-06-04T18:15:54.547 に答える