Todas as 700 instâncias poderiam ser executadas simultaneamente?
Isso depende do que você quer dizer com simultaneamente. Se estamos sendo exigentes, não, eles não podem, a menos que você tenha 700 threads de execução em seu sistema, que você pode utilizar (provavelmente não). Realisticamente, sim, eles provavelmente podem, desde que você tenha RAM e / ou espaço suficiente no sistema. O UNIX e seus vários filhos são extraordinariamente bons no gerenciamento de grandes níveis de simultaneidade, e é por isso que eles são tão populares no uso de HPC em larga escala.
Até onde posso chegar até que meu servidor atinja seu limite?
É impossível responder concretamente sem muito mais informações. Praticamente, você precisa ter memória suficiente para atender:
- Todos os requisitos de memória de tempo de execução de um trabalho, vezes 700.
- Os requisitos de memória do bash para gerenciar muitos trabalhos (o bash não é horrível sobre isso, mas o controle do trabalho não é exatamente eficiente em termos de memória).
- Quaisquer outros requisitos de memória no sistema.
Supondo que você cumpra isso (novamente, com apenas 50 GB de RAM, você ainda precisa lidar com outros problemas:
- Quanto tempo de CPU será desperdiçado pelo bash no controle de tarefas? Provavelmente não muito, mas com centenas de empregos, isso pode ser significativo.
- Quanta largura de banda de rede é necessária? Apenas abrir todas essas conexões pode invadir sua rede por alguns minutos, dependendo da largura de banda e latência.
- Muitas outras coisas em que provavelmente não pensei.
Quando esse limite for atingido, será necessário aguardar o início da próxima iteração ou a caixa falhará?
Depende do limite atingido. Se for memória, algo morrerá no sistema (mais especificamente, será morto pelo kernel na tentativa de liberar memória) ou o próprio sistema poderá travar (não é incomum configurar sistemas para travar intencionalmente quando ficar sem memória). Se for tempo de CPU, ele continuará sem problemas, será impossível fazer muito mais no sistema. Se for a rede, você poderá travar outros sistemas ou serviços.
O que você realmente precisa aqui não é executar todos os trabalhos ao mesmo tempo. Em vez disso, divida-os em lotes e execute todos os trabalhos em um lote ao mesmo tempo, deixe-os terminar e inicie o próximo lote. O GNU Parallel ( https://www.gnu.org/software/parallel/ ) pode ser usado para isso, mas é menos do que o ideal nessa escala em um ambiente de produção (se você continuar, não fique muito agressivo, como eu disse, você pode invadir a rede e afetar os sistemas que de outra forma não tocaria). Eu realmente recomendaria procurar uma ferramenta de orquestração de rede adequada como o Ansible ( https://www.ansible.com/), pois isso não apenas resolverá seus problemas de simultaneidade (o Ansible faz o lote como eu mencionei acima automaticamente), mas também oferece muitos outros recursos úteis para trabalhar (como execução idempotente de tarefas, bons relatórios de status e integração nativa com um número muito grande de outras ferramentas).
parallel
, usando cerca de 50 empregos simultâneos. É um ótimo meio entre o paralelismo de 1 e 700. A outra coisa legal é que é sem lotes. Uma única conexão paralisada será interrompida apenas, não nenhuma das outras. A principal desvantagem é o gerenciamento de erros. Nenhuma dessas abordagens baseadas em shell lidará normalmente com erros. Você precisará verificar manualmente o sucesso e fazer suas próprias tentativas.