A melhor maneira de fazer com que o conjunto de tarefas atribua um trabalho a núcleos aleatórios?

A melhor maneira de fazer com que o conjunto de tarefas atribua um trabalho a núcleos aleatórios?

Tenho um aplicativo cuja licença limita a 4 núcleos por instância, rodando em uma caixa de 16 núcleos. Várias dessas instâncias são executadas em paralelo.

As instâncias aumentam e diminuem ao longo do dia. Em .bash_profile a variável "START" é atribuída a "taskset -c 0-3 rlwarp ..." e outros scripts (ou humanos na caixa) iniciam instâncias usando $START. O resultado final é que quando a caixa está sob carga pesada, você pode acabar com quatro núcleos atrelados enquanto os outros 12 ficam ociosos.

Gostaria de modificar "START" para atribuir o conjunto de tarefas a quatro núcleos aleatórios para ajudar a aliviar o problema. Alguma sugestão sobre a melhor maneira de fazer isso?

Responder1

Se o conjunto de tarefas puder receber uma lista de números, uma abordagem seria fazer isso para obter uma lista de 4 números aleatórios:

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

Outra ideia aproximada seria encontrar uma raiz de número aleatório e adicionar 3 a ele assim:

$ 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..."

Exemplos

$ 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...

Solução definitiva

Solução final de Chuu (como uma linha):

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

Como funciona

Obtenha um número aleatório entre 1-16:

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

Fazendo a divisão do módulo 4 vezes, adicionando 1 a $RTEST antes nos permite incrementar os números para gerar o intervalo:

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

Realizar a divisão de módulo é uma ótima maneira de encaixotar um número para obter resultados em um intervalo específico.

$ echo $((RTEST%16))
3

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

Isso garante que você sempre obterá um número entre 1 e 16. Ele até mesmo lida com o problema quando obtemos números aleatórios acima de 13.

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

informação relacionada