it-swarm-eu.dev

Jak omezit proces na jedno jádro CPU v Linuxu?

Jak omezit proces na jedno jádro procesoru?

Něco podobného ulimit nebo cpulimit by bylo Nice. (Jen pro zajištění: Nechci omezit procentuální využití nebo dobu provádění. Chci donutit aplikaci (se všemi svými dětmi, procesy (vlákna)), aby používaly jedno jádro procesoru (nebo 'n' jádra procesorů)).

74

V systému Linux spusťte sched_setaffinity systémové volání. Afinita procesu je sada procesorů, na kterých může běžet. K dispozici je standardní obal Shell: taskset . Například pro připnutí procesu k CPU # 0 (musíte vybrat konkrétní 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

Pro oba Perl existují moduly třetích stran ( Sys::CpuAffinity ) a Python ( affinity ) k nastavení afinity procesu. Obě tyto práce fungují jak pro Linux, tak pro Windows (Windows mohou vyžadují další moduly třetích stran s Sys::CpuAffinity); Sys::CpuAffinity také pracuje na několika dalších unixových variantách.

Pokud chcete nastavit afinitu procesu od jeho narození, nastavte afinitu aktuálního procesu těsně před voláním execve. Tady je triviální obal, který nutí proces provést na CPU 0.

#!/usr/bin/env Perl
use POSIX;
use Sys::CPUAffinity;
Sys::CpuAffinity::setAffinity(getpid(), [0]);
exec $ARGV[0] @ARGV

Na příkazovém řádku můžete také vytvářet sady CPU. man cpuset Později k nim můžete přiřadit (spuštěné) procesy.

6
Nils