Habilitar SSH simultâneo maciço em um único servidor

9

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:

  1. Em /etc/security/limits.confe /etc/security/limits.d/90-nproc.conf, defina macio e rígido nofilee nproc65535 (este é o valor máximo possível, certo? - Atualização: não. O valor máximo é 1048576 )
  2. In /etc/sysctl.conf, setkernel.pty.max = 65535
  3. In /etc/ssh/sshd_config, set MaxStartups 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!

Clara
fonte
1
O log do servidor sshd pode fornecer mais informações sobre o motivo da rejeição de conexões. Basicamente, se você quiser apenas 10000 sessões, recomendo que você use a multiplexação usando o ControlMaster (e, é claro, bata no MaxSessions).
Jakuje 3/08/15
1
Eu não acho sleep 100sque faz o que você pensa. Ele é executado não na sessão ssh, mas em sua própria máquina.
Daniel kullmann
1
@Jakuje obrigado por me lembrar de verificar o log do servidor! Eu encontrei 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! :)
Clara
1
Interessante, quando executo uma das linhas, 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".
Daniel kullmann
2
@danielkullmann Sim, você está absolutamente certo - 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 !!
Clara

Respostas:

2

/ 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 o ulimit -Hn 65535& ulimit -n 65535dentro do /etc/init.d/sshscript usando esses comandos ulimit, eu levantei os nofiles do sshd para 65535/65535 de 1024/4096

Hvisage
fonte