Meu objetivo é permitir que 10000 ssh s simultâneos sejam executados em um único servidor.
Para simplificar, estou fazendo o ssh no localhost:
for i in `seq 1 10000`; do
ssh localhost "echo ${i}; sleep 100" >>./info 2>>./log &
done
sleep 100é garantir que quando o 10000º ssh for iniciado, o primeiro ssh ainda estiver em conexão, de fato, haverá 10000 ssh s concorrentes .
E aqui estão os dois tipos de mensagens de erro que recebi:
1. ssh_exchange_identification: Connection closed by remote host
2. ssh_exchange_identification: read: Connection reset by peer
Fiz as seguintes modificações:
- Em
/etc/security/limits.confe/etc/security/limits.d/90-nproc.conf, defina macio e rígidonofileenproc65535 (este é o valor máximo possível, certo? - Atualização: não. O valor máximo é 1048576 ) - In
/etc/sysctl.conf, setkernel.pty.max = 65535 - In
/etc/ssh/sshd_config, setMaxStartups 10000.
Essas modificações permitem executar com êxito 1000 ssh s simultâneos em um único servidor, mas elas não funcionam para 2000 e acima do ssh s.
Algumas pessoas sugeriram alterar o valor de MaxSessions(na verdade, não estou claro sobre seu uso: como a multiplexação afeta o meu caso?) /proc/sys/net/core/netdev_max_backlogE /proc/sys/net/core/somaxconn, mas elas parecem não fazer diferença.
Além disso, não há erro se forem 10000 ssh s simultâneos para servidores diferentes (os problemas ocorrem apenas quando ssh em um único servidor):
for i in `seq 1 10000`; do
j=$(( 1 + $i % 8 ))
ssh server-${j} "echo hi; sleep 100" >info-${j} 2>log-${j} &
done
Estou preso nisso há muito tempo.
Qualquer ajuda seria profundamente apreciada!
sleep 100sque faz o que você pensa. Ele é executado não na sessão ssh, mas em sua própria máquina.
error: reexec socketpair: Too many open files, então suponho que o valor anterior de nofile(ou seja, 65535) estivesse longe de ser suficiente. Não estou familiarizado com o ControlMaster, mas vou tentar, obrigado! :)
ps axu | egrep "ssh|sleep" | grep -v grepapenas uma lista sleep 100s, não a ssh. Eu acho que você deve mudar o comando para ssh "echo hi; sleep 100s".
sleep 100deve estar no comando enviado pelo ssh, que é o caso no meu script atual, mas eu fiz um erro de digitação aqui. Eu atualizei o post principal de acordo. Muito obrigado por apontar !!