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

2

Eu tenho um aplicativo cuja licença limita a 4 núcleos por instância, sendo executado 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. No .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 é quando a caixa está sob carga pesada, você pode acabar com quatro núcleos indexados enquanto os outros 12 estão inativos.

Eu gostaria de modificar "START" para atribuir a atribuição de taskset a quatro núcleos aleatórios para ajudar a aliviar o problema. Alguma sugestão sobre a melhor maneira de fazer isso?

    
por Chuu 26.09.2013 / 18:48

1 resposta

2

Se o conjunto de tarefas puder obter uma lista de números, uma abordagem seria fazer isso para obter uma lista de quatro 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 difícil seria encontrar um número aleatório raiz 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 final

A solução final do Chuu (como um liner):

$ 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 de nos permitir 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 inserir um número para que você obtenha 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-16. Ele até lida com o wrap quando recebemos números aleatórios acima de 13.

$ echo $(((14 + 3)%16))
1
    
por 26.09.2013 / 20:12