Un kernel exclusivement pour mon processus

Duplication possible:
comment définir l’affinité du processeur d’un pthread particulier?

Existe-t-il un moyen sous Linux de désactiver un cœur pour tous les processus, sauf un processus? Je voudrais avoir un kernel réservé uniquement et uniquement pour mon processus.

Le comportement attendu est le suivant:

  1. Les processus qui seront générés après mon processus ne devraient pas voir ce kernel et utiliser les autres.
  2. Lorsque mon processus est généré, tous les processus qui utilisent ce cœur doivent être basculés vers d’autres cœurs.

Oui il y a. Vous voulez créer deux cpusets, l’un avec votre CPU isolé et l’autre avec tous les autres processeurs. Assignez votre processus spécial au cpuset isolé et tous les autres processus à l’autre cpuset.

Voici un exemple de script simple qui le fera:

mkdir /cpuset mount -t cpuset none /cpuset/ cd /cpuset mkdir sys # create sub-cpuset for system processes /bin/echo 0-2 > sys/cpuset.cpus # assign cpus (cores) 0-2 to this set # adjust if you have more/less cores /bin/echo 1 > sys/cpuset.cpu_exclusive /bin/echo 0 > sys/cpuset.mems mkdir rt # create sub-cpuset for my process /bin/echo 3 > rt/cpuset.cpus # assign cpu (core) 3 to this cpuset # adjust this to number of cores-1 /bin/echo 1 > rt/cpuset.cpu_exclusive /bin/echo 0 > rt/cpuset.mems /bin/echo 0 > rt/cpuset.sched_load_balance /bin/echo 1 > rt/cpuset.mem_hardwall # move all processes from the default cpuset to the sys-cpuset for T in `cat tasks`; do echo "Moving " $T; /bin/echo $T > sys/tasks; done 

Commencez maintenant votre processus et découvrez son PID et allez:

 /bin/echo $PID > /cpuset/rt/tasks 

Si vous souhaitez annuler ces modifications, redémarrez simplement votre système ou procédez comme suit:

 # move tasks back from sys-cpuset to root cpuset for T in `cat /cpuset/sys/tasks`; do echo "Moving " $T; /bin/echo $T > /cpuset/tasks; done # remove sys-cpuset rmdir /cpuset/sys # move tasks back from rt-cpuset to root cpuset for T in `cat /cpuset/rt/tasks`; do echo "Moving " $T; /bin/echo $T > /cpuset/tasks; done # remove rt-cpuset rmdir /cpuset/rt # unmount and remove /cpuset umount /cpuset rmdir /cpuset 

Voici la page de manuel: http://www.kernel.org/doc/man-pages/online/pages/man7/cpuset.7.html

Il existe également des wrappers de shell plus complexes qui peuvent vous aider à automatiser cela, comme cset. Voir: http://web.archive.org/web/20120428093126/http://www.suse.com/documentation/slerte_11/slerte_tutorial/data/slerte_tutorial.html

Vous pouvez consulter cet article pour une discussion sur la solution du kernel à ce problème.