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?
Respuestas:
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)
fuente