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 100
jest 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:
- W
/etc/security/limits.conf
i/etc/security/limits.d/90-nproc.conf
, ustaw miękki i twardynofile
inproc
na 65535 (to jest maksymalna możliwa wartość, prawda? - Aktualizacja: nie. Maksymalna wartość to 1048576 ) - W
/etc/sysctl.conf
zestawiekernel.pty.max = 65535
- W
/etc/ssh/sshd_config
zestawieMaxStartups 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_backlog
I /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!
sleep 100s
robi to, co myślisz. Jest wykonywany nie w sesji ssh, ale na twoim komputerze.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ę !! :)ps axu | egrep "ssh|sleep" | grep -v grep
tylko lista zawierasleep 100s
, a niessh
. Myślę, że powinieneś zmienić polecenie nassh "echo hi; sleep 100s"
.sleep 100
powinno 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 !!Odpowiedzi:
/ 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 wymuszenieulimit -Hn 65535
&ulimit -n 65535
wewnątrz/etc/init.d/ssh
skryptu za pomocą komend ulimit, podniosłem nofile sshd do 65535/65535 z 1024/4096źródło