
Tenho que lançar um número total, NUMTOT de um programa (pode ser qualquer, C, Mathematica, ns-2... ambientes matemáticos). O problema é que o computador onde estes processos rodam só admite um número máximo de execuções, por exemplo MAX, (MAX < NUMTOT).
Eu executo esses programas com a seguinte linha em um terminal
./run.sh -d directory num
repetidamente, onde run.sh é um script a partir do qual invoco o programa matemático; directory é o diretório onde está meu programa e num indica o número de novas execuções (integer*num = NUM). O script 'run.sh' cria diretórios 'num' com uma cópia de 'diretório' (o programa) e inicia 'num' número de instâncias do programa. No meu caso são instâncias do Matlab.
Gostaria de um script que monitorasse automaticamente o número de processos em execução e quando o número máximo for reduzido para (MAX-num), porque 'num' já terminou, então lance as próximas 'num' simulações do Matlab até o total NUM de simulações foi concluída.
Seria ainda melhor se o script pudesse manter o MAX processos possíveis apenas invocando o próximo programa quando apenas um tiver acabado.
Na verdade, para saber a quantidade de processos em execução eu executo o seguinte script
ps axu |grep plopez|grep simulacion|grep MATLAB|awk '{ $2} END{print NR}'
o que dá o total de Matlabs em execução neste momento.
Como eu poderia fazer todo o conjunto de simulações apenas a partir de um único script?
Responder1
A maneira usual de impor um número máximo de processos por usuário é via pam_limits(8)
. Verifique a limits.conf(5)
página de manual para obter detalhes e exemplos para alterá-lo /etc/security/limits.conf
adequadamente.
Especificamente, você deseja configurar o nproc
parâmetro:
nproc
maximum number of processes
Um exemplo da página de manual com este parâmetro em uso:
@faculty soft nproc 20
@faculty hard nproc 50
Responder2
Em vez de verificar periodicamente o número de instâncias em execução, sugiro escrever um script que execute o programa repetidamente até NUM
ser alcançado e iniciar esse script MAX
em paralelo.
Você também pode capturar o SIGCHLD
sinal emitido quando um processo filho é encerrado. Isso deve ser habilitado primeiro com set -o monitor
. Um exemplo mais detalhado e alternativas podem ser encontrados emum tópico no Stackoverflow.
Responder3
Se seus trabalhos MATLAB não forem interativos (ou seja, executando um script em lote), então você pode querer procurar um software de agendamento em lote comoTorqueouSlurm- este tipo de gerenciamento de recursos é exatamente o que eles foram projetados para fazer.
Normalmente são usados em clusters HPC, mas no seu caso você teria um cluster com apenas um nó de computação.
Slurm tem a vantagem de ser um sistema moderno e bem projetado, aproveitando anos de experiência anterior com outros escalonadores. O Torque/PBS tem a vantagem da familiaridade – muitas pessoas já o usaram em outros clusters. Slurm possui um conjunto de wrappers de compatibilidade para que pessoas acostumadas com PBS ou Torque possam começar a usá-lo imediatamente com comandos familiares.
Qualquer um deles lhe daria muitas opções para controlar o agendamento de trabalhos - por núcleos de CPU, memória, licenças disponíveis e muito mais. eles também fornecem contabilidade se você precisar controlar ou limitar o uso cumulativo por usuário. O Slurm, por exemplo, tem uma opção de ponderação de uso justo que pode ser usada para priorizar empregos de pessoas que não executaram muitos empregos recentemente em relação a pessoas que usaram muito o sistema - o que geralmente é melhor do que uma cota fixa de total tempo de CPU.
Outra opção para contornar licenças limitadas é escrever seus scripts MATLAB para que sejam compatíveis comOitava GNUbem como MATLAB. Em seguida, você pode executar quantas execuções de teste/desenvolvimento precisar e fazer a execução final no MATLAB, se for necessário para publicar seus resultados ou colaborar com outros pesquisadores. Octave é principalmente compatível com MATLAB, mas existem algumas diferenças - aqui está umresumo.
Responder4
Umresposta em outro tópico que trata da limitação do número de subprocessos no bashmostra o trecho a seguir, que aguardará até que um dos quatro trabalhos seja concluído, verificando a cada dez segundos.
while [ $(jobs | wc -l) -ge 4 ] ; do sleep 10 ; done
Tenha em mente que essa estratégia de sono ativo é bastante ineficiente, grosseira e imprecisa.