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 zawiera sleep 100s
, a nie ssh
. Myślę, że powinieneś zmienić polecenie na ssh "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 !!