El conjunto de tareas no funciona en una variedad de núcleos en isolcpus

12

Para comenzar, estoy usando Debian Wheezy con el kernel 3.2 en un chipset AMD64. Mi máquina tiene dos núcleos Xeon E5-2690. Configuré los parámetros de arranque para que todos los núcleos en una CPU estén dedicados a un solo proceso. Para hacer esto, he configurado isolcpus = 8,9,10,11,12,13,14,15 en grub.

Hasta aquí todo bien. Ahora digamos que quiero usar las CPU aisladas para un comando dado, para ser simple, solo usaré un bucle infinito simple:

$ taskset -c 8-15 bash -c 'mientras es verdadero; do echo hola> / dev / null; hecho' &

Hasta ahora todo bien, la parte superior muestra que el núcleo 8 gira hasta casi el 100% de utilización. Ahora digamos que vuelvo a ejecutar ese comando:

$ taskset -c 8-15 bash -c 'mientras es verdadero; do echo hola> / dev / null; hecho' &

Ahora la parte superior muestra que los núcleos 9-15 permanecen inactivos y los dos procesos comparten el núcleo 8. Si, en cambio, hago esto:

$ taskset -c 8 bash -c 'mientras es verdadero; do echo hola> / dev / null; hecho' &

$ taskset -c 9 bash -c 'mientras es verdadero; do echo hola> / dev / null; hecho' &

Los núcleos 8 y 9 obtienen el 100% de utilización como deberían. Esto solo se aplica a isolcpus porque el mismo conjunto de tareas con los núcleos 1-7 distribuye correctamente los procesos sobre los núcleos relevantes. Además, "taskset -p" muestra que la máscara de afinidad para los procesos 8-15 está configurada correctamente. Parece que el planificador del kernel se niega a usar cualquier cosa que no sea el núcleo más bajo especificado en una máscara de afinidad isolcpus.

Ahora, normalmente esto no sería un gran problema con mis ejemplos anteriores, solo especifique núcleos individuales para cada proceso. Sin embargo, quiero ejecutar una aplicación altamente multiproceso en la CPU dedicada. Quiero especificar el conjunto principal y hacer que el grupo de subprocesos lo use automáticamente, sin tener que restablecer individualmente la afinidad del procesador para cada subproceso individual que se genera.

¿Alguien tiene alguna idea de cómo hacer que el planificador me proporcione más de un núcleo del conjunto isolcpu?

usuario79126
fuente
¿Puedes intentar usar un programa multiproceso? bash no es multiproceso
c4f4t0r
1
Sí, originalmente eso fue lo que me hizo notar (mi programa multiproceso no estaba usando más de un núcleo). Una secuencia de comandos de Python simple que crea muchos subprocesos no puede utilizar más de un núcleo cuando se ejecuta en el conjunto isolcpus. (Cuando se ejecuta en los núcleos no aislados, utiliza todos los 8 núcleos disponibles).
user79126
lea este linuxtopia.org/online_books/linux_kernel/kernel_configuration/… , esto excluye un cpus del programador del kernel, pero después de excluir cpus, ¿desea ejecutar el proceso en el cpus excluido?
c4f4t0r
1
El kernel no programará un subproceso o proceso en la isolcpu a menos que la máscara de afinidad del procesador indique que debe usarse. De lo contrario, isolcpus sería lo mismo que apagar el núcleo, cuando el propósito es reservar un núcleo por una razón especificada por el usuario y asegurarse de que ningún proceso no deseado lo use. El conjunto de tareas establece la máscara de afinidad para usar todos los núcleos en el rango 8-15 (que se establece correctamente cuando se registra / proc), por lo que el núcleo debe programar el proceso en los núcleos inactivos.
user79126

Respuestas:

9

Después de un día de frustración, he determinado una solución. Este comportamiento parece ser un artefacto del algoritmo predeterminado del planificador del núcleo (SCHED_OTHER para esta distribución / núcleo). Cambiar el proceso a un algoritmo diferente elimina el problema, los isóclidos se utilizan adecuadamente en todos los procesos / subprocesos.

Terminé usando SCHED_RR, pero también probé SCHED_FIFO y SCHED_IDLE, los cuales parecen funcionar. El proceso se puede iniciar con el algoritmo alternativo mediante el uso de la utilidad chrt:

$ sudo chrt -r 1 [comando]

(Si desea ejecutar como no root, puede utilizar la utilidad setcap para habilitar CAP_SYS_NICE en el archivo binario relacionado con el comando)

usuario79126
fuente
1
Aunque la tarea de establecer la afinidad con los núcleos 0,1 mi aplicación Java solo utilizó el primer núcleo. 'sudo chrt -r 1 [comando]' también resolvió mi problema.
Barry NL