¿La mejor manera de que el conjunto de tareas asigne un trabajo a núcleos aleatorios?

¿La mejor manera de que el conjunto de tareas asigne un trabajo a núcleos aleatorios?

Tengo una aplicación cuya licencia la limita a 4 núcleos por instancia, ejecutándose en una caja de 16 núcleos. Varias de estas instancias se ejecutan en paralelo.

Las instancias suben y bajan a lo largo del día. En .bash_profile la variable "START" se asigna a "taskset -c 0-3 rlwarp ..." y otros scripts (o humanos en el cuadro) inician instancias usando $START. El resultado final es que cuando la caja está bajo una carga pesada, puede terminar con cuatro núcleos fijados mientras los otros 12 funcionan inactivos.

Me gustaría modificar "INICIO" para asignar el conjunto de tareas a cuatro núcleos aleatorios para ayudar a aliviar el problema. ¿Alguna sugerencia sobre la mejor manera de hacer esto?

Respuesta1

Si el conjunto de tareas puede tomar una lista de números, un enfoque sería hacer esto para obtener una lista de 4 números aleatorios:

$ for (( i=1;i<=16;i++ )) do echo $RANDOM $i; done|sort -k1|cut -d" " -f2|head -4
8
2
15
5

Otra idea aproximada sería encontrar un número aleatorio raíz y agregarle 3 de esta manera:

$ baseCPU=$(for (( i=1;i<=13;i++ )) do echo $RANDOM $i; done|sort -k1|cut -d" " -f2 | head -1)
$ echo "taskset -c ${baseCPU}-$(expr $baseCPU + 3) rlwarp..."

Ejemplos

$ baseCPU=$(for (( i=1;i<=13;i++ )) do echo $RANDOM $i; done|sort -k1|cut -d" " -f2 | head -1)
$ echo "taskset -c ${baseCPU}-$(expr $baseCPU + 3) rlwarp..."
taskset -c 1-4 rlwarp...

$ baseCPU=$(for (( i=1;i<=13;i++ )) do echo $RANDOM $i; done|sort -k1|cut -d" " -f2 | head -1)
$ echo "taskset -c ${baseCPU}-$(expr $baseCPU + 3) rlwarp..."
taskset -c 2-5 rlwarp...

$ baseCPU=$(for (( i=1;i<=13;i++ )) do echo $RANDOM $i; done|sort -k1|cut -d" " -f2 | head -1)
$ echo "taskset -c ${baseCPU}-$(expr $baseCPU + 3) rlwarp..."
taskset -c 12-15 rlwarp...

Solución definitiva

La solución final de Chuu (como frase única):

$ RTEST=$(($RANDOM % 16));\ 
   taskset -c "$((RTEST%16)),$(((RTEST + 1)%16)),$(((RTEST+2)%16)),$(((RTEST+3)%16))" rlwrap ... 

Cómo funciona

Obtenga un número aleatorio entre 1 y 16:

$ RTEST=$(($RANDOM % 16));
$ echo $RTEST
3

Haciendo la división de módulo 4 veces, sumando 1 a $RTEST antes nos permite incrementar los números para generar el rango:

$ echo $((RTEST%16)),$(((RTEST + 1)%16)),$(((RTEST+2)%16)),$(((RTEST+3)%16))
3,4,5,6

Realizar una división de módulo es una excelente manera de encuadrar un número para obtener resultados en un rango específico.

$ echo $((RTEST%16))
3

$ echo $(((RTEST + 3)%16))
6

Hacer esto garantiza que siempre obtendrá un número entre 1 y 16. Incluso maneja el ajuste cuando obtenemos números aleatorios superiores a 13.

$ echo $(((14 + 3)%16))
1

información relacionada