Linuxでは、プロセスのCPUアフィニティを設定するシステムコールは sched_setaffinity
です。次に、コマンドラインでそれを行うtaskset
ツールがあります。
その単一のプログラムを1つのCPUだけで実行するには、次のようなものが必要だと思います
taskset -c 1 ./myprogram
(任意のCPU番号を-c
スイッチの引数として設定します。)
他のプロセスが測定対象のプロセスと比較してあまり実行されないか、他のプロセスが他のCPUにスケジュールされている限り、これはシングルプロセッサシステムに十分近いはずです。1つのCPUをその単一のプロセスのみに割り当て、他のプロセスがそのCPUで実行されないようにする場合は、それらのアフィニティも設定する必要があります。
それは、適切に行う方法がわかりません。init
システムのすべてのプロセスに確実に継承されるように、ブートプロセスの非常に早い段階でプロセッサアフィニティを設定する必要があります。回避策として、taskset -c -p 0 $PID
他のすべてのプロセスを使用して、それらを強制的にCPU#0でのみ実行することができます。
systemdにも持っているCPUAffinity=
ユニットファイルでの親和性を制御するために、そこにあるカップルの質問 unix.SEに、ここでデフォルトの親和性を設定するには、しかし、私は良いソリューションとのいずれかを見つけることができませんでした。
@Kamil Maciorowskiが コメントし、superuser.comで別の質問に回答したにもかかわらずisolcpus=1
、カーネルコマンドラインでの設定は、「そのCPUを一般的なスケジューリングアルゴリズムから分離する」必要があります。