Mein Ziel ist es, 10000 gleichzeitige SSHs auf einem einzelnen Server laufen zu lassen .
Der Einfachheit halber sende ich mich an localhost:
for i in `seq 1 10000`; do
ssh localhost "echo ${i}; sleep 100" >>./info 2>>./log &
done
sleep 100
soll sicherstellen, dass beim Starten des 10000. SSH das 1. SSH noch in Verbindung ist, sodass tatsächlich 10000 gleichzeitige SSHs vorhanden sind .
Und hier sind die zwei Arten von Fehlermeldungen, die ich erhalten habe:
1. ssh_exchange_identification: Connection closed by remote host
2. ssh_exchange_identification: read: Connection reset by peer
Ich habe folgende Änderungen vorgenommen:
- In
/etc/security/limits.conf
und/etc/security/limits.d/90-nproc.conf
setzen Sie soft & hardnofile
&nproc
auf 65535 (dies ist der maximal mögliche Wert, oder? - Update: Nein. Der maximale Wert ist 1048576 ) - In
/etc/sysctl.conf
setzenkernel.pty.max = 65535
- In
/etc/ssh/sshd_config
setzenMaxStartups 10000
.
Diese Änderungen ermöglichen es mir, 1000 gleichzeitige SSHs erfolgreich auf einem einzelnen Server auszuführen , aber sie funktionieren nicht für 2000 und höher SSHs .
Einige Leute haben vorgeschlagen, den Wert für zu ändern MaxSessions
(eigentlich ist mir nicht klar, wie er verwendet wird: Wie wirkt sich Multiplexing auf meinen Fall aus?), /proc/sys/net/core/netdev_max_backlog
Und /proc/sys/net/core/somaxconn
sie scheinen keinen Unterschied zu machen.
Außerdem gibt es keinen Fehler, wenn es sich um 10000 gleichzeitige SSHs auf verschiedenen Servern handelt (Probleme treten nur auf, wenn SSH auf einem einzelnen Server ausgeführt werden):
for i in `seq 1 10000`; do
j=$(( 1 + $i % 8 ))
ssh server-${j} "echo hi; sleep 100" >info-${j} 2>log-${j} &
done
Ich habe ziemlich lange daran festgehalten.
Jede Hilfe wäre sehr dankbar!
sleep 100s
macht, was du denkst. Es wird nicht in der SSH-Sitzung ausgeführt, sondern auf Ihrem eigenen Computer.
error: reexec socketpair: Too many open files
, also war der vorherige Wert von nofile
(dh 65535) bei weitem nicht genug. Ich bin nicht mit ControlMaster vertraut, aber ich werde es versuchen, danke !! :)
ps axu | egrep "ssh|sleep" | grep -v grep
listet a nur die sleep 100s
, nicht die ssh
. Ich denke, Sie sollten den Befehl in ändern ssh "echo hi; sleep 100s"
.
sleep 100
sollten in dem Befehl sein, der über ssh gesendet wird, was in meinem eigentlichen Skript der Fall ist, aber ich habe hier einen Tippfehler gemacht. Ich habe den Hauptbeitrag entsprechend aktualisiert. Vielen Dank für den Hinweis!