Aktivieren Sie Massive Concurrent SSH auf einem einzelnen Server


9

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 100soll 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:

  1. In /etc/security/limits.confund /etc/security/limits.d/90-nproc.confsetzen Sie soft & hard nofile& nprocauf 65535 (dies ist der maximal mögliche Wert, oder? - Update: Nein. Der maximale Wert ist 1048576 )
  2. In /etc/sysctl.confsetzenkernel.pty.max = 65535
  3. In /etc/ssh/sshd_configsetzen MaxStartups 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_backlogUnd /proc/sys/net/core/somaxconnsie 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!


1
Das sshd-Serverprotokoll kann weitere Informationen zum Grund für das Ablehnen von Verbindungen enthalten. Wenn Sie nur 10000 Sitzungen wünschen, würde ich Ihnen grundsätzlich empfehlen, Multiplexing mit ControlMaster zu verwenden (und dann natürlich MaxSessions zu starten).
Jakuje

1
Ich glaube nicht, dass das sleep 100smacht, was du denkst. Es wird nicht in der SSH-Sitzung ausgeführt, sondern auf Ihrem eigenen Computer.
Daniel Kullmann

1
@ Jakuje, danke, dass du mich daran erinnert hast, das Serverprotokoll zu überprüfen! Ich habe gefunden 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 !! :)
Clara

1
Interessant, wenn ich eine der Zeilen ausführe, ps axu | egrep "ssh|sleep" | grep -v greplistet a nur die sleep 100s, nicht die ssh. Ich denke, Sie sollten den Befehl in ändern ssh "echo hi; sleep 100s".
Daniel Kullmann

2
@danielkullmann Ja, Sie haben absolut Recht - sleep 100sollten 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!
Clara

Antworten:


2

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, das ulimit -Hn 65535& ulimit -n 65535innerhalb des /etc/init.d/sshSkripts mit diesen ulimit-Befehlen zu erzwingen. Ich habe die Nofiles des sshd von 1024/4096 auf 65535/65535 erhöht

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.