Eu preciso fazer algum trabalho em 700 dispositivos de rede usando um script de espera. Eu posso fazê-lo sequencialmente, mas até agora o tempo de execução é de cerca de 24 horas. Isso se deve principalmente ao tempo que leva para estabelecer uma conexão e ao atraso na saÃda desses dispositivos (antigos). Eu sou capaz de estabelecer duas conexões e executá-las em paralelo muito bem, mas até onde posso empurrar isso?
Eu não imagino que eu poderia fazer todos os 700 de uma vez, certamente há algum limite para o não. de conexões telnet que minha VM pode gerenciar.
Se eu tentasse iniciar 700 deles em algum tipo de loop como este:
for node in `ls ~/sagLogs/`; do
foo &
done
Com
CPU 12 CPUs x Intel(R) Xeon(R) CPU E5649 @ 2.53GHz
Memória 47,94 GB
Minha pergunta é:
- Todas as 700 instâncias poderiam ser executadas simultaneamente?
- Até onde eu poderia chegar até meu servidor atingir seu limite?
- Quando esse limite for atingido, ele apenas esperará para iniciar a próxima iteração
foo
ou a caixa travará?
Infelizmente, estou executando em um ambiente de produção corporativo, então não posso simplesmente tentar e ver o que acontece.
Isso depende do que você quer dizer com simultaneamente. Se estamos sendo exigentes, então não, eles não podem, a menos que você tenha 700 threads de execução em seu sistema que você possa utilizar (provavelmente não). Realisticamente, sim, eles provavelmente podem, desde que você tenha RAM suficiente e/ou espaço de troca no sistema. O UNIX e seus vários filhos são notavelmente bons em gerenciar grandes nÃveis de simultaneidade, e é por isso que eles são tão populares para uso de HPC em larga escala.
Isso é impossÃvel de responder concretamente sem muito mais informações. Praticamente, você precisa ter memória suficiente para atender:
Supondo que você encontre isso (novamente, com apenas 50 GB de RAM, você ainda terá que lidar com outros problemas:
Depende de qual 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á funcionando sem problemas, será impossÃvel fazer muito mais no sistema. Se for a rede, porém, você pode 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. GNU Parallel ( https://www.gnu.org/software/parallel/ ) pode ser usado para isso, mas é menos do que ideal nessa escala em um ambiente de produção (se você for com ele, não seja muito agressivo, como eu disse, você pode inundar a rede e afetar sistemas que de outra forma não tocaria). Eu realmente recomendo 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 batching como mencionei acima automaticamente), mas também fornecerá muitos outros recursos úteis para trabalhar (como execução idempotente de tarefas, relatórios de status agradáveis ​​e integração nativa com um número muito grande de outras ferramentas).
É difÃcil dizer especificamente quantas instâncias podem ser executadas como trabalhos em segundo plano da maneira que você descreve. Mas um servidor normal certamente pode manter 700 conexões simultâneas, desde que você faça isso corretamente. Os servidores da Web fazem isso o tempo todo.
Posso sugerir que você use o GNU paralelo ( https://www.gnu.org/software/parallel/ ) ou algo semelhante para fazer isso? Isso lhe daria uma série de vantagens para a abordagem de trabalho em segundo plano:
Dê uma olhada aqui para um inÃcio rápido: https://www.gnu.org/software/parallel/parallel_tutorial.html#A-single-input-source
Usar
&
para processamento paralelo é bom ao fazer alguns e ao monitorar o progresso. Mas se você estiver executando em um ambiente de produção corporativo, precisará de algo que lhe dê melhor controle.Isso será executado
foo
para cada arquivo em~/sagLogs
. Ele inicia um trabalho a cada 0,5 segundos, executará tantos trabalhos em paralelo quanto possÃvel, desde que 1 GB de RAM esteja livre, mas respeitará os limites do seu sistema (por exemplo, número de arquivos e processos). Normalmente, isso significa que você executará 250 trabalhos em paralelo se não tiver ajustado o número de arquivos abertos permitidos. Se você ajustar o número de arquivos abertos, não deverá ter problemas ao executar 32.000 em paralelo - contanto que tenha memória suficiente.Se um trabalho falhar (ou seja, retornar com um código de erro), ele será repetido 10 vezes.
my.log
informará se um trabalho foi bem-sucedido (após possÃveis tentativas) ou não.o sistema ficará lento e sem resposta, o pior caso é tão sem resposta que seria melhor apenas apertar o botão liga / desliga e fazer uma reinicialização forçada ... isso seria executar algo como root, onde ele teria o privilégio de fazer isso. Se o seu script bash está sendo executado sob privilégios de usuário regulares, então a primeira coisa que vem à mente é
/etc/security/limits.conf
e/etc/systemd/system.conf
todas as variáveis ​​nele [idealmente falando] impedir que o(s) usuário(s) sobrecarreguem o sistema.cpu = xeon E5649, que é uma CPU de 12 núcleos ; então você tem 12 núcleos para que 12 processos sejam executados simultaneamente, cada um utilizando um dos doze núcleos a 100%. Se você iniciar 24 processos, cada um funcionará com 50% de utilização em cada um dos doze núcleos, 700 processos = 1,7%, mas é um computador, desde que tudo seja concluÃdo corretamente em um tempo ok, então isso = sucesso; ser eficiente nem sempre é relevante.
Todas as 700 instâncias poderiam ser executadas simultaneamente? Certamente, 700 não é um número grande; meu
maxproc
padrão /etc/security/limits.conf é 4.135.275 por exemploAté onde eu poderia chegar até meu servidor atingir seu limite? Muito mais do que 700, tenho certeza.
Limites ... o que acontecerá se o script for iniciado em uma conta de usuário [e geralmente o root também
limits.conf
se aplica a todos] é que o script será encerrado depois de tentar fazerfoo &
700 vezes; você esperaria ver 700 processos foo , cada um com um pid diferente, mas pode ver apenas 456 (escolha de número aleatório) e os outros 244 nunca foram iniciados porque foram bloqueados por algum limite de segurança ou systemd.Pergunta de um milhão de dólares: quantos você deve executar simultaneamente?
estar envolvido com a rede e você disse que cada um fará uma conexão telnet, o palpite é que você encontrará limites e sobrecarga de rede antes de fazer limites de CPU e RAM. Mas não sei o que você está fazendo especificamente, o que provavelmente acontecerá é que você pode iniciar todos os 700 de uma só vez, mas as coisas serão bloqueadas automaticamente até que os processos anteriores e as conexões de rede terminem e fechem com base em vários limites do sistema, ou algo como o os primeiros 500 serão iniciados e os 200 restantes não, porque os limites do sistema ou do kernel o impedem. Mas, por mais que muitos corram ao mesmo tempo, haverá alguns doceslocal para fazer as coisas o mais rápido possÃvel... minimizando a sobrecarga e aumentando a eficiência. Sendo 12 núcleos (ou 24 se você tiver 2 cpu's), comece com 12 (ou 24) de uma só vez e aumente esse número de lote simultâneo em 12 ou 24 até não ver melhoria no tempo de execução.
dica: google max telnet conexões e veja como isso se aplica ao(s) seu(s) sistema(s). Também não se esqueça dos firewalls. Faça também o cálculo rápido da memória necessária por processo x 700; certifique-se de < RAM disponÃvel (cerca de 50 GB no seu caso), caso contrário o sistema começará a usar o SWAP e basicamente não responderá. Então chute de 12, 24, N processos por vez e monitore a RAM livre, então aumente N já tendo algum conhecimento do que está acontecendo.