linux - portable - picard tag
Un nĂșcleo exclusivo para mi proceso (2)
Posible duplicado:
¿Cómo establecer la afinidad de la CPU de un pthread particular?
¿Hay una forma en Linux para deshabilitar un núcleo para todos los procesos excepto un proceso? Me gustaría tener un núcleo reservado solo y solo para mi proceso.
El comportamiento esperado es el siguiente:
- Los procesos que se generarán después de mi proceso, no deberían ver este núcleo y utilizar los otros.
- Cuando se genera mi proceso, todos los procesos que utilizan este núcleo deben cambiarse a otros núcleos.
Puede echar un vistazo a este artículo de lwn para una discusión sobre la solución del kernel para este problema.
Sí hay. Desea crear dos cpusets, uno con su CPU aislada y el otro con el resto de las CPU. Asigne su proceso especial al conjunto de datos aislado y todo el resto de los procesos al otro conjunto de recursos.
Aquí hay un ejemplo simple de script 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 comienza tu proceso y descubre su PID y ve:
/bin/echo $PID > /cpuset/rt/tasks
Si desea revertir estos cambios, simplemente reinicie su sistema o haga:
# 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 envoltorios de shell más complicados que pueden ayudarlo a automatizar esto, como cset. Consulte: http://web.archive.org/web/20120428093126/http://www.suse.com/documentation/slerte_11/slerte_tutorial/data/slerte_tutorial.html