AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 516203
Accepted
KuboMD
KuboMD
Asked: 2019-04-30 09:30:10 +0800 CST2019-04-30 09:30:10 +0800 CST 2019-04-30 09:30:10 +0800 CST

O que acontece se eu iniciar muitos trabalhos em segundo plano?

  • 772

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 é:

  1. Todas as 700 instâncias poderiam ser executadas simultaneamente?
  2. Até onde eu poderia chegar até meu servidor atingir seu limite?
  3. Quando esse limite for atingido, ele apenas esperará para iniciar a próxima iteração fooou 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.

bash background-process
  • 4 4 respostas
  • 7641 Views

4 respostas

  • Voted
  1. Best Answer
    Austin Hemmelgarn
    2019-04-30T11:50:25+08:002019-04-30T11:50:25+08:00

    Todas as 700 instâncias poderiam ser executadas simultaneamente?

    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.

    Até onde eu poderia chegar até meu servidor atingir seu limite?

    Isso é impossível de 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 tantos trabalhos (o bash não é horrível quanto a 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ê encontre isso (novamente, com apenas 50 GB de RAM, você ainda terá que 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, pode ser significativo.
    • Quanta largura de banda de rede isso vai precisar? Apenas abrir todas essas conexões pode inundar sua rede por alguns minutos, dependendo da sua largura de banda e latência.
    • Muitas outras coisas que eu provavelmente não pensei.

    Quando esse limite for atingido, ele apenas esperará para começar a próxima iteração fora do foo ou a caixa travará?

    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).

    • 17
  2. laenkeio
    2019-04-30T09:53:39+08:002019-04-30T09:53:39+08:00

    É 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:

    • Você pode alterar facilmente o número de sessões simultâneas.
    • E aguardará até que as sessões sejam concluídas antes de iniciar novas.
    • É mais fácil abortar.

    Dê uma olhada aqui para um início rápido: https://www.gnu.org/software/parallel/parallel_tutorial.html#A-single-input-source

    • 12
  3. Ole Tange
    2019-04-30T14:52:07+08:002019-04-30T14:52:07+08:00

    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.

    ls ~/sagLogs/ | parallel --delay 0.5 --memfree 1G -j0 --joblog my.log --retries 10 foo {}
    

    Isso será executado foopara 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.loginformará se um trabalho foi bem-sucedido (após possíveis tentativas) ou não.

    • 10
  4. ron
    2019-05-01T04:46:30+08:002019-05-01T04:46:30+08:00

    O que acontece se eu iniciar muitos trabalhos em segundo plano?

    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.confe /etc/systemd/system.conftodas 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.

      1. Todas as 700 instâncias poderiam ser executadas simultaneamente? Certamente, 700 não é um número grande; meu maxprocpadrão /etc/security/limits.conf é 4.135.275 por exemplo

      2. Até onde eu poderia chegar até meu servidor atingir seu limite? Muito mais do que 700, tenho certeza.

      3. Limites ... o que acontecerá se o script for iniciado em uma conta de usuário [e geralmente o root também limits.confse aplica a todos] é que o script será encerrado depois de tentar fazer foo &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.

    Por padrão, o RHEL limita o número de conexões telnet de um único host a 10 sessões simultâneas. Este é um recurso de segurança... definido como 10, /etc/xinetd.conf, altere o valor “per_sourceâ€.

    • 1

relate perguntas

  • exportar variáveis ​​​​env programaticamente, via stdout do comando [duplicado]

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve