web-dev-qa-db-ja.com

Linuxでプロセスを1つのCPUコアに制限する方法

プロセスを1つのCPUコアに制限するにはどうすればよいですか?

ulimitcpulimitに似たものがいいでしょう。 (念のため:使用率や実行時間を制限したくありません。アプリ(そのすべての子、プロセス(スレッド)を含む)で1つのCPUコア(または「n」CPUコア)を使用することを強制したいです。

74

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後で、これらに(実行中の)プロセスを割り当てることができます。

6
Nils