Comment limiter le processus à un seul cœur de processeur?
Quelque chose de similaire à ulimit
ou cpulimit
serait bien. (Juste pour m'assurer: je ne veux PAS limiter le pourcentage d'utilisation ou le temps d'exécution. Je veux forcer l'application (avec tous ses enfants, les processus (threads)) à utiliser un noyau cpu (ou des cœurs 'n' cpu)).
Sous Linux, exécutez sched_setaffinity
appel système. L'affinité d'un processus est l'ensemble des processeurs sur lesquels il peut s'exécuter. Il y a un wrapper Shell standard: taskset
. Par exemple, pour épingler un processus au CPU # 0 (vous devez choisir un CPU spécifique):
taskset -c 0 mycommand --option # start a command with the given affinity
taskset -c -pa 0 1234 # set the affinity of a running process
Il existe des modules tiers pour Perl ( Sys::CpuAffinity
) et Python ( affinity
) pour définir l'affinité d'un processus. Les deux fonctionnent sur Linux et Windows (Windows peut nécessite d'autres modules tiers avec Sys::CpuAffinity
); Sys::CpuAffinity
fonctionne également sur plusieurs autres variantes Unix.
Si vous souhaitez définir l'affinité d'un processus à partir de sa naissance, définissez l'affinité du processus actuel immédiatement avant d'appeler execve
. Voici un wrapper trivial qui force un processus à s'exécuter sur le CPU 0.
#!/usr/bin/env Perl
use POSIX;
use Sys::CPUAffinity;
Sys::CpuAffinity::setAffinity(getpid(), [0]);
exec $ARGV[0] @ARGV
Vous pouvez également créer des cpu-sets sur la ligne de commande. man cpuset
Plus tard, vous pouvez leur assigner (exécuter) des processus.