プロセスを1つのCPUコアに制限するにはどうすればよいですか?
ulimit
やcpulimit
に似たものがいいでしょう。 (念のため:使用率や実行時間を制限したくありません。アプリ(そのすべての子、プロセス(スレッド)を含む)で1つのCPUコア(または「n」CPUコア)を使用することを強制したいです。
Linuxでは、 sched_setaffinity
システムコールを実行します。プロセスの親和性とは、プロセスを実行できるプロセッサのセットです。標準のシェルラッパーがあります: taskset
。たとえば、プロセスをCPU#0に固定するには(特定のCPUを選択する必要があります):
taskset -c 0 mycommand --option # start a command with the given affinity
taskset -c -pa 0 1234 # set the affinity of a running process
Perl( Sys::CpuAffinity
)とPython( affinity
)の両方にサードパーティモジュールがあります。プロセスのアフィニティを設定します。これらは両方ともLinuxとWindowsの両方で機能します(WindowsはSys::CpuAffinity
を備えた他のサードパーティモジュールを必要とする場合があります); Sys::CpuAffinity
は他のいくつかのUNIXバリアントでも機能します。
誕生時からプロセスのアフィニティを設定する場合は、execve
を呼び出す直前に現在のプロセスのアフィニティを設定します。 CPU 0でプロセスを強制的に実行する簡単なラッパーを次に示します。
#!/usr/bin/env Perl
use POSIX;
use Sys::CPUAffinity;
Sys::CpuAffinity::setAffinity(getpid(), [0]);
exec $ARGV[0] @ARGV
コマンドラインでcpu-setsを構築することもできます。 man cpuset
後で、これらに(実行中の)プロセスを割り当てることができます。