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 denofile
(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 listasleep 100s
, não assh
. Eu acho que você deve mudar o comando parassh "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 !!Respostas:
/ eu queria que ele pudesse comentar
O sshd precisa (normalmente, mas embora você não tenha especificado os casos de uso exatos etc.) alocar um pty por login, no entanto, no seu caso, ssh "echo hi; sleep 100s" NÃO aloca um pty, então não há necessidade da configuração kernel.pty.max ... a menos que você queira que milhares de usuários façam login * ... para testar isso, você precisará adicionar a opção -t aos seus testes, ou seja. ssh -t "ecoa oi; durma 100s"
De volta ao problema em questão com os
error: reexec socketpair: Too many open files
testes em um sistema Wheezy com upgrade distinto para Jessie, descobri que / etc / security / limit * não altera os limites do sshd.verifique se com o
cat /proc/<pid-of-sshd>/limits
qual, no meu caso, após definir no /etc/security/limits.conf: * nofile soft 65535 * nofile hard 65535 ainda reporta apenas 1024 (soft) e 4096 (hard) para os limites do sshd. A resolução parece ser forçar oulimit -Hn 65535
&ulimit -n 65535
dentro do/etc/init.d/ssh
script usando esses comandos ulimit, eu levantei os nofiles do sshd para 65535/65535 de 1024/4096fonte