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 vonnofile
(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 diesleep 100s
, nicht diessh
. Ich denke, Sie sollten den Befehl in ändernssh "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!Antworten:
Ich wünschte, er könnte einen Kommentar abgeben
sshd muss (normalerweise, aber obwohl Sie die genauen Anwendungsfälle usw. nicht angegeben haben) eine Pty pro Login zuweisen. In Ihrem Fall weist ssh "echo hi; sleep 100s" jedoch KEINE Pty zu Die Einstellung kernel.pty.max ist nicht erforderlich. Wenn Sie nicht möchten, dass Tausende von Benutzern angemeldet sind * ..., um dies zu testen, müssen Sie Ihren Tests die Option -t hinzufügen, d. h. ssh -t "echo hi; schlaf 100s"
Zurück zu dem Problem mit den
error: reexec socketpair: Too many open files
Tests auf einem Wheezy, das auf ein Jessie-System aktualisiert wurde, stellte ich fest, dass / etc / security / limit * die Grenzen des sshd nicht ändert.Überprüfen Sie, ob
cat /proc/<pid-of-sshd>/limits
in meinem Fall nach dem Festlegen von /etc/security/limits.conf: * nofile soft 65535 * nofile hard 65535 immer noch nur 1024 (soft) und 4096 (hard) für die Grenzwerte von sshd gemeldet werden. Die Auflösung scheint darin zu bestehen, dasulimit -Hn 65535
&ulimit -n 65535
innerhalb des/etc/init.d/ssh
Skripts mit diesen ulimit-Befehlen zu erzwingen. Ich habe die Nofiles des sshd von 1024/4096 auf 65535/65535 erhöhtquelle