web-dev-qa-db-fra.com

Comment limiter un processus à un cœur de processeur sous Linux?

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)).

74

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.

6
Nils