Włącz masowe współbieżne SSH na jednym serwerze


9

Moim celem jest, aby 10000 współbieżnych ssh działało na jednym serwerze.

Dla uproszczenia przesyłam ssh do localhost:

for i in `seq 1 10000`; do
    ssh localhost "echo ${i}; sleep 100"  >>./info 2>>./log &
done

sleep 100jest upewnienie się, że kiedy rozpocznie się 10000. ssh, 1. ssh jest nadal połączone, więc rzeczywiście jest 10000 równoczesnych ssh .

A oto dwa rodzaje komunikatów o błędach, które otrzymałem:

1. ssh_exchange_identification: Connection closed by remote host

2. ssh_exchange_identification: read: Connection reset by peer

Dokonałem następujących modyfikacji:

  1. W /etc/security/limits.confi /etc/security/limits.d/90-nproc.conf, ustaw miękki i twardy nofilei nprocna 65535 (to jest maksymalna możliwa wartość, prawda? - Aktualizacja: nie. Maksymalna wartość to 1048576 )
  2. W /etc/sysctl.confzestawiekernel.pty.max = 65535
  3. W /etc/ssh/sshd_configzestawie MaxStartups 10000.

Te modyfikacje pozwalają mi z powodzeniem uruchomić 1000 współbieżnych ssh na jednym serwerze, ale nie działają dla 2000 i więcej ssh .

Niektóre osoby zasugerowały zmianę wartości MaxSessions(właściwie nie jestem pewien na temat jej użycia: w jaki sposób multipleksowanie wpływa na moją sprawę?) /proc/sys/net/core/netdev_max_backlogI /proc/sys/net/core/somaxconn, ale wydaje się, że nie mają znaczenia.

Poza tym nie ma błędu, jeśli są one równymi 10000 ssh na różnych serwerach (problemy występują tylko wtedy, gdy ssh na jednym serwerze):

for i in `seq 1 10000`; do
    j=$(( 1 + $i % 8 ))
    ssh server-${j} "echo hi; sleep 100" >info-${j} 2>log-${j} &
done

Utknąłem na tym dość długo.
Każda pomoc byłaby bardzo mile widziana!


1
Dziennik serwera sshd może zawierać więcej informacji o przyczynie odrzucenia połączeń. Zasadniczo, jeśli chcesz tylko 10000 sesji, zaleciłbym użycie multipleksowania za pomocą ControlMaster (a następnie oczywiście wybij MaxSessions).
Jakuje

1
Nie sądzę, że sleep 100srobi to, co myślisz. Jest wykonywany nie w sesji ssh, ale na twoim komputerze.
Daniel Kullmann

1
@Jakuje dzięki za przypomnienie, żebym sprawdził log serwera! Znalazłem error: reexec socketpair: Too many open files, więc przypuszczam, że poprzednia wartość nofile(tj. 65535) była daleka od wystarczającej. Nie znam ControlMaster, ale spróbuję, dziękuję !! :)
Clara,

1
Ciekawe, kiedy wykonam jedną z linii, ps axu | egrep "ssh|sleep" | grep -v greptylko lista zawiera sleep 100s, a nie ssh. Myślę, że powinieneś zmienić polecenie na ssh "echo hi; sleep 100s".
Daniel Kullmann

2
@danielkullmann Tak, masz absolutną rację - sleep 100powinno być w poleceniu wysłanym przez ssh, tak jak ma to miejsce w moim prawdziwym skrypcie, ale tutaj napisałem literówkę. Zaktualizowałem odpowiednio główny post. Dziękuję bardzo za zwrócenie na to uwagi !!
Clara,

Odpowiedzi:


2

/ ja chciałbym móc komentować

sshd musi (zwykle, ale chociaż nie określiłeś dokładnych przypadków użycia itp.) przydzielić pty na login, jednak w twoim przypadku ssh "echo hi; sleep 100s" NIE przydziela pty, więc nie ma potrzeby ustawienia kernel.pty.max ... chyba że chcesz, aby tysiące użytkowników zalogowało się * ... aby to przetestować, musisz dodać opcję -t do swoich testów, tj. ssh -t "echo hi; sleep 100s"

Wracając do error: reexec socketpair: Too many open files aktualnego problemu z Testami na Diste Wheezy uaktualnionym do systemu Jessie, odkryłem, że / etc / security / limit * nie zmienia limitów sshd.

sprawdź, z cat /proc/<pid-of-sshd>/limits czym w moim przypadku po ustawieniu w /etc/security/limits.conf: * nofile soft 65535 * nofile hard 65535 nadal zgłasza tylko 1024 (soft) i 4096 (hard) dla limitów sshd. Wydaje się, że rozwiązaniem jest wymuszenie ulimit -Hn 65535& ulimit -n 65535wewnątrz /etc/init.d/sshskryptu za pomocą komend ulimit, podniosłem nofile sshd do 65535/65535 z 1024/4096

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.