コアの多いCPUがあるとしましょう。与えられたプロセスが一度起動すると、コアの1つにバインドされますか?
これは、未使用のコアが複数ある場合でもプロセスが遅くなることを意味しますか?たとえば、core0はプロセスAとBで使用されており、プロセスAはコアを100%使用しており、core1が完全にアイドル状態であってもプロセスBは実行できません。
そうですか?
答え1
プロセスは本質的にカーネルに接続されていません。プロセスの実行がスケジュールされるたびに、関連リストのすべてのコアでプロセスを実行できます。相関リストが明示的に設定されていない場合、プロセスはどのコアでも実行できます。
このコマンドを使用して、プロセスのアフィニティセットを確認または設定できますtaskset
(man taskset
該当するマニュアルを参照)。具体的にこう書く。
Linux スケジューラは指定された CPU アフィニティを尊重し、プロセスは他の CPU で実行されません。 Linuxスケジューラは自然なCPUの好みもサポートします。パフォーマンス上の理由から、スケジューラは可能な限りプロセスを同じ CPU に保持しようとします。したがって、特定のCPUの好みを強制することは、特定のアプリケーションでのみ有用です。
はい
sleep 1000 & slpid=$!
echo "PID of sleep is $slpid" # 5221
taskset --pid $slpid
pid 5221's current affinity mask: 3 # bitmask
taskset --cpu-list --pid $slpid
pid 5221's current affinity list: 0,1 # list of potential cores
taskset --cpu-list --pid 0 $slpid
pid 5221's current affinity list: 0,1
pid 5221's new affinity list: 0 # bound now only to core 0
kill $slpid # all done, tidy up