name keywords etiquetas ejemplos description content c linux linux-kernel cpu scheduling

c - keywords - meta tags ejemplos



Todo un nĂșcleo dedicado a un solo proceso (5)

¿Hay alguna forma en Linux para asignar un núcleo de CPU a un proceso dado particular y no debería haber ningún otro proceso o interrupción de controladores para programarse en este núcleo?

He leído acerca de la afinidad del proceso en procesos de vinculación de Linux a CPU utilizando la utilidad del conjunto de tareas, pero eso no soluciona mi problema porque solo intenta afinar el proceso dado a ese núcleo, pero es posible que otros procesos puedan programarse en este núcleo y esto es lo que quiero evitar

¿Deberíamos cambiar el código del kernel para la programación?


Dedicar un Core CPU completo a un programa particular

Si bien el conjunto de tareas permite asignar un programa en particular a ciertas CPU, eso no significa que no se programarán otros programas o procesos en esas CPU. Si desea evitar esto y dedicar un núcleo completo de CPU a un programa en particular, puede usar el parámetro kernel "isolcpus", que le permite reservar el núcleo de la CPU durante el arranque.

Agregue el parámetro del kernel "isolcpus =" al gestor de arranque durante el arranque o el archivo de configuración GRUB. Entonces, el programador de Linux no programará ningún proceso regular en los núcleos de CPU reservados, a menos que se solicite específicamente con el conjunto de tareas. Por ejemplo, para reservar núcleos de CPU 0 y 1, agregue el parámetro de kernel "isolcpus = 0.1". Al arrancar, utilice el conjunto de tareas para asignar de forma segura los núcleos de CPU reservados a su programa.

Fuentes)

  1. http://xmodulo.com/2013/10/run-program-process-specific-cpu-cores-linux.html
  2. http://www.linuxtopia.org/online_books/linux_kernel/kernel_configuration/re46.html

Hay un artículo de Redhat hablando de eso. Modifica el parámetro de arranque isolcpus .

Y un viejo artículo escrito por Robert Love. Y hay una solución en ese artículo.

Todos los hijos de un proceso reciben la misma máscara de afinidad de CPU que sus padres.

Entonces, todo lo que tenemos que hacer es hacer que init se una a un solo procesador. Todos los demás procesos, por naturaleza de init, son la raíz del árbol de procesos y, por lo tanto, el superparent de todos los procesos, y se unen al mismo procesador.


Incluso si sigue los pasos en la respuesta de gby, las tareas del núcleo se ejecutan en el núcleo de CPU aislado. Se está trabajando en el proyecto en tiempo real RT_PREEMPT de Linux para mejorar esto. Entonces, si no está utilizando un kernel en tiempo real de última generación de RP_PREEMPT, podría no ser posible aislar completamente un núcleo de CPU.


Sí hay. De hecho, hay dos formas diferentes de hacerlo :-)

En este momento, la mejor manera de lograr lo que quieres es hacer lo siguiente:

  1. Agregue el parámetro isolcpus = [número_cpu] a la línea de comando del kernel de Linux desde el gestor de arranque durante el arranque. Esto le indicará al planificador de Linux que no ejecute ninguna tarea regular en esa CPU a menos que se solicite específicamente utilizar la afinidad de la CPU.

  2. Utilice la afinidad de IRQ para configurar otras CPU para que manejen todas las interrupciones para que su CPU aislada no reciba ninguna interrupción.

  3. Utilice la afinidad de CPU para arreglar su tarea específica a la CPU aislada.

Esto le dará lo mejor que Linux puede ofrecer con respecto al aislamiento de la CPU sin parches fuera de árbol y en desarrollo.

Su tarea seguirá siendo interrumpida de vez en cuando por el código de Linux, incluidas otras tareas, como la interrupción del ticker y el código del planificador, los IPI de otras CPU y cosas como los hilos del núcleo de la cola de trabajo, aunque la interrupción debería ser mínima.

Para obtener una lista (casi) completa de las fuentes de interrupción, consulte mi página en https://github.com/gby/linux/wiki

El método alternativo es usar cpusets, que es mucho más elegante y dinámico, pero adolece de algunas debilidades en este momento (por ejemplo, no hay migración de temporizadores) lo que me hace recomendar el antiguo, crudo pero eficaz parámetro isolcpus.

Tenga en cuenta que la comunidad Linux está trabajando actualmente para abordar todos estos problemas y más para aislar aún mejor.


Según la documentation

El programador de Linux respetará la afinidad dada de la CPU y el proceso no se ejecutará en ninguna otra CPU.

No se menciona que el procesador específico se otorgará para procesar exclusivamente.