(4 réponses)
Fermé il y a 3 ans.
Comment limiter le processus à un cœur de processeur ?
Quelque chose de similaire à ulimit
ou cpulimit
serait bien. (Juste pour s'assurer:je ne veux PAS limiter l'utilisation en pourcentage ou le temps d'exécution. Je veux forcer l'application (avec tous ses enfants, processus (threads)) à utiliser un cœur de processeur (ou 'n' cœurs de processeur)).
Réponse acceptée :
Sous Linux, exécutez le sched_setaffinity
appel système. L'affinité d'un processus est l'ensemble des processeurs sur lesquels il peut s'exécuter. Il existe 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 à la fois sur Linux et Windows (Windows peut nécessiter d'autres modules tiers avec Sys::CpuAffinity
); Sys::CpuAffinity
fonctionne également sur plusieurs autres variantes d'Unix.
Si vous souhaitez définir l'affinité d'un processus à partir de sa naissance, définissez l'affinité du processus en cours juste 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