![A melhor maneira de fazer com que o conjunto de tarefas atribua um trabalho a núcleos aleatórios?](https://rvso.com/image/50562/A%20melhor%20maneira%20de%20fazer%20com%20que%20o%20conjunto%20de%20tarefas%20atribua%20um%20trabalho%20a%20n%C3%BAcleos%20aleat%C3%B3rios%3F.png)
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