CPUコアを1つだけ使用する


9

並行プログラムのパフォーマンステストを実行する必要があります。私の要件は、1つの CPUコアでのみ実行する必要があることです。(スレッドを協調させたくありません-常にコンテキストを切り替えたいです)。

だから私は2つの質問があります:

  1. 最善の解決策-(CPUコアを使用しないようにOSを強制するために)自分のプログラムに対してのみ1つのCPUコアのみに署名して予約する方法。それは不可能だと思いますが、おそらく私は間違っています...

  2. 1つのCPUコアのみを使用するようにLinux(Fedora 24)を設定する方法は?



1
最近のCPUは、合計で使用されているコアの数に応じて速度を変更できることに注意してください。プロセスが単一コアのみを使用していて、他のプロセスがそれを使用していないことを確認しても、そのコアの速度は、オペレーティングシステムが他のコアをどのように使用するかによって異なります。テストを実行するときは、これを考慮してください。
liori 2016年

OSがコアの速度を変更している可能性があると上記の@lioriが述べたように、BIOSからCPUコアを非アクティブ化できるはずです。
Marcs

VMを作成してそれに1つのコアのみを割り当てるのはどうですか?ああ、私は「このCPUコアを使用しないこと」を読んだだけなので、気にしないで
ください。– sakisk

回答:


26

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を一般的なスケジューリングアルゴリズムから分離する」必要があります。


これは質問に対する答えにはなりません。タスクセット(またはタスクアフィニティを設定する他の方法)は、プロセスが指定されたコアのセットでのみ実行されることを保証しますが、それらのコアでそのプロセスのみが実行されることは保証しません。つまり、オペレーティングシステムは、プロセスアフィニティを設定したコアに他のプロセスをスケジュールできます。実際には、これは最も有用な回答ですが、制限に注意してください。特に、1)で要求する内容が得られないことに注意してください。このCPUコアは使用しないでください) "
James Greenhalgh

@JamesGreenhalghですが、すべてのプロセスにCPUアフィニティを設定する方法を見つけると、質問に答えることになります。カーネル(コマンドライン)オプションとして、新しいプロセスのデフォルトのCPUアフィニティを設定することは可能ですか?これはブートプロセスの早い段階で有効になり、すべてのプロセスに影響します。
jpaugh 2016年

そのCPUで他のプロセスが実行されないようにすることについて、括弧内の節を実際に見逃しました。あるいは、最大の問題は、問題のプログラムが4つではなく1つのコアでのみ実行され、他のプロセスが一種の迷惑行為と見なされることを確認することであろうと考えたかもしれません。それに比べて。しかし、認めます。カミルがコメントしたことを除いて、質問のその部分には適切な答えがありませんでした。
ilkkachu

@jpaugh、それでも、「あなたの」コアで別のプロセスが実行される可能性から完全に自分自身を分離することはできないと思います。たとえば、独自のアフィニティをリセットするものや、プロセスの管理に関係のない時間を費やすカーネルコード自体です。繰り返しますが、実際には、この答えが問題の大部分を解決するためにほとんど何をするかであることに完全に同意しますが、括弧の最後の部分の答えを読むことに本当に興味があります!
James Greenhalgh、2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.