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.conf
e/etc/security/limits.d/90-nproc.conf
, defina macio e rígidonofile
enproc
65535 (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_backlog
E /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 100s
que 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 grep
apenas uma lista sleep 100s
, não a ssh
. Eu acho que você deve mudar o comando para ssh "echo hi; sleep 100s"
.
sleep 100
deve 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 !!