2012-01-30 7 views
27

Duplicar posible:
how to set CPU affinity of a particular pthread?un núcleo exclusivamente para mi proceso

¿Hay alguna manera en Linux para desactivar un núcleo para todos los procesos excepto un proceso? Me gustaría tener un núcleo reservado solo y solo para mi proceso.

comportamiento esperado es de la siguiente manera:

  1. Los procesos que serán iniciados después de mi proceso, no deben ver a este núcleo y el uso de los demás.
  2. Cuando se genera mi proceso, todos los procesos que utilizan este núcleo deben cambiarse a otros núcleos.
+0

el término que está buscando es afinidad con el hilo. Es posible, pero a menudo * peor * en términos de rendimiento general que dejar que el programador lo resuelva. – Flexo

+4

@awoodland: al revés. No pidió que su proceso no use otros núcleos, pidió otros procesos para no usar su núcleo. –

+0

@Benvoight - ¡Uy, mi error! Eso hace que la respuesta sea más o menos "no", entonces :) – Flexo

Respuesta

6

Puede echar un vistazo a este lwn article para una discusión sobre la solución kernel a este problema.

38

Sí, la hay. Desea crear dos cpusets, uno con su CPU aislada y el otro con el resto de las CPU. Asigna tu proceso especial al cpuset aislado y todo el resto de los procesos al otro cpuset.

Aquí es un script de ejemplo simple que lo hará:

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 

Ahora empieza su proceso y averiguar su PID y vaya:

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

Si desea revertir estos cambios, simplemente reiniciar el sistema o hacer:

# 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 

Aquí está la página del manual: http://www.kernel.org/doc/man-pages/online/pages/man7/cpuset.7.html

También hay envolturas de shell más complicadas que pueden ayudarlo a automatizar esto, como cset. Ver: http://web.archive.org/web/20120428093126/http://www.suse.com/documentation/slerte_11/slerte_tutorial/data/slerte_tutorial.html

+1

Gracias por una descripción tan detallada :) Voy a probar su solución. –

+0

Y si quiero deshacer estos cambios, ¿cómo puedo hacer eso? –

+1

El enlace al tutorial de SUSE está muerto, [aquí] (http://web.archive.org/web/20120428093126/http://www.suse.com/documentation/slerte_11/slerte_tutorial/data/slerte_tutorial.html) es una versión archivada 'cset shield' se ajusta perfectamente a mis necesidades. – sjakobi

Cuestiones relacionadas