Como executar o script bash via multithreading

2

Eu tenho um script bash que cria eventos de colisão de alta energia, se um evento levar cerca de 2 minutos, em seguida, para 100000 eventos, leva 200000 minutos, o que é muito. então se eu tiver 50 núcleos em um nó, eu quero ter um evento em cada núcleo, então, dessa forma, haverá 50 eventos gerados em 2 minutos, então o tempo será salvo. Eu pensei que isso pode ser feito por multi-threading, ou qualquer outra maneira pela qual isso pode ser feito ?, então alguém pode me ajudar?

    
por Sudhir Rode 28.06.2016 / 12:12

2 respostas

2

O GNU Parallel é feito para esse tipo de tarefa.

seq 100000 | parallel do_experiment

Se sua experiência usar diferentes tipos de valores (digamos, modelos), você poderá executar todas as experiências para todos os modelos:

seq 100000 | parallel do_experiment --iteration {1} --model {2} :::: - ::: model1 model2

O padrão será 1 processo por núcleo da CPU e garantirá que a saída de dois trabalhos paralelos não seja misturada. Se você tiver vários computadores sem uso em seu laboratório, também poderá fazê-los participar do cálculo.

O GNU Parallel é um paralelizador geral e facilita a execução de trabalhos em paralelo na mesma máquina ou em várias máquinas para as quais você tem acesso ssh. Muitas vezes, pode substituir um loop for .

Se você tem 32 tarefas diferentes que você quer rodar em 4 CPUs, uma forma direta de paralelizar é rodar 8 tarefas em cada processador:

O

GNUParallelgeraumnovoprocessoquandoumtermina-mantendoasCPUsativaseeconomizandotempo:

Instalação

Se o GNU Parallel não for empacotado para sua distribuição, você poderá fazer uma instalação pessoal, que não requer acesso root. Isso pode ser feito em 10 segundos ao fazer isso:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

Para outras opções de instalação, consulte o link

Saiba mais

Veja mais exemplos: link

Assista aos vídeos de introdução: link

Percorra o tutorial: link

Inscreva-se na lista de e-mail para obter suporte: link

    
por 04.07.2016 / 08:06
0

Você pode iniciar os trabalhos como processos em segundo plano até atingir o limite de 50 trabalhos em segundo plano e, em seguida, aguardar a conclusão de um trabalho antes de iniciar outro.

LIMIT=50
while collision_event_to_run
do 
    run_new_collision_event&

    while (( $(jobs | wc -l) >= LIMIT ))
    do
                sleep 1
    done

done

ou melhor para executar novos eventos enquanto a média de carga é baixa.

LIMIT=49
while collision_event_to_run
do 
    run_new_collision_event&
    sleep 2   # let time for the load average calculation

    while (( $(cut -d " " -f1 < /proc/loadavg) >= LIMIT ))
    do
                sleep 1
    done

done

Outra opção é usar o comando batch para empilhar as tarefas na fila em lote atd .

batch collision _event_1
batch collision _event_2
batch collision _event_3
...

atd service iniciará o trabalho em paralelo até que a carga do servidor atinja um limite. Esse limite é um parâmetro de atd , ele deve ser definido no script de início do serviço atd , atd -l 50 , por exemplo.

Editar:

  • Para manter uma pequena CPU gratuita para o sistema operacional atd -l 49 .

  • O atd iniciará um novo trabalho a cada minuto, o que é muito lento, para permitir que o servidor atinja a carga quando os trabalhos durarem 2 minutos. Você pode reduzir o atraso com o parâmetro -b . atd -b 2 -l 49 para iniciar um trabalho a cada 2 segundos permitirá atingir o limite antes que os primeiros trabalhos sejam concluídos.

por 28.06.2016 / 15:09