Warum dauert es einige zehn Sekunden, bis eine Shell-Eingabeaufforderung angezeigt wird?

30

Normalerweise wird nach dem SSH-Vorgang auf einem Server (oder dem Öffnen eines Terminals auf meinem Mac) das Anmeldebanner sofort gedruckt. Es dauert jedoch ca. 10 Sekunden bis eine Minute, bis die Shell-Eingabeaufforderung angezeigt wird. Danach ist die Leistung in Ordnung und die Netzwerklatenz ist nicht ungewöhnlich.

Dies scheint keine rechenintensive, speicherintensive oder IO-lastige Aufgabe zu sein. Was macht es mit all den Milliarden von CPU-Zyklen?

jacobbaer
quelle
8
ssh -v -v -vund ur_shell -xmöglicherweise umsichtige Schritte zum Debuggen.
Am
2
Enthält Ihr viele Zeilen .bash_history?
Kasperd
2
Sehen Sie sich Ihr .profile und zugehörige Dateien an (leider nicht sicher, welche Shell Sie verwenden) und entfernen Sie sie vorübergehend, um festzustellen, ob dies die Dinge verbessert. Sie haben wahrscheinlich einen oder mehrere Befehle, bei denen eine Zeitüberschreitung auftritt.
TheFiddlerWins
3
Ist es alternativ zum Vorschlag von Moby Disk immer noch genauso langsam, wenn Sie die Shell selbst aus der Shell heraus starten? Wenn es langsam ist, wenn eine Verbindung (wieder) hergestellt wird, aber schnell, wenn eine zweite Shell in einer vorhandenen, verbundenen Sitzung gestartet wird, wird Ihnen mitgeteilt, dass die Verzögerung nicht durch die Shell selbst verursacht wird. Wenn es in beiden Situationen gleich langsam ist, nimmt die Shell beim Start viel Zeit in Anspruch. In beiden Fällen erfahren Sie, welcher Aspekt von "Von Null zu Shell-Eingabeaufforderung" langsam ist.
ein Lebenslauf vom
2
Häufig wird versucht, eine GSSAPI-Authentifizierung durchzuführen (was wahrscheinlich völlig nutzlos ist, wenn Sie kein Kerberos-Shop sind). In anderen Fällen handelt es sich um DNS-Reverse-Lookups.
Charles Duffy

Antworten:

33

Hier könnte einiges passieren. Sie finden die meisten Antworten in Ihrem Shell-Handbuch, aber diese sind normalerweise unglaublich lang und schräg, also ...

Die Chancen stehen gut, dass Ihr Problem auf einige Dinge zurückzuführen ist.

Wenn Ihr Profil oder Ihre Website teure Dinge enthält, sollten Sie sie zurückschneiden.

Wenn Ihr Profil oder bashrc eine umgekehrte DNS-Suche verwendet (um die Eingabeaufforderung oder etwas anderes festzulegen), korrigieren Sie DNS oder verwenden Sie stattdessen den Hostnamen.

Shells öffnen beim Initialisieren unter anderem viele Dateien. Wenn die Systemlast hoch ist, wird sie hier häufig angezeigt.

Wenn es sich bei dem Banner um eine Vorauthentifizierung handelt, ist möglicherweise auch die Authentifizierung (Pam, LDAP usw.) langsam.

Es könnte jedoch keines dieser Dinge sein. Unmittelbar vor der Anzeige der Eingabeaufforderung passiert überraschend viel!

Falcon Momot
quelle
1
Ein weiterer Block, den ich seit einiger Zeit gesehen habe, ist der Versuch einer GSSAPI-Authentifizierung (falls nicht in der SSH-Client- oder -Serverkonfiguration deaktiviert). Die Verwendung eines systemübergreifenden Tracing-Tools wie sysdig ist wahrscheinlich die beste Silberkugel, die es gibt, um diese Art von Problem zu lösen.
Charles Duffy
+1 Gründliche Antwort. Diese Seite hat ein schönes Flussdiagramm für Logins, welche Dateien sie ausführen / quellen und andere Informationen.
Tim S.
15
+1. In 99% der Fälle ist dies die umgekehrte DNS-Suche.
mpontillo
@ Mike: das gleiche hier - ich würde empfehlen, mit diesem zu beginnen, da es einfach zu beheben ist. Es war 100% in meinem Fall.
16.
22

Wahrscheinlich wird entweder auf DNS gewartet oder versucht, sich über LDAP oder dergleichen zu authentifizieren.

Versuchen Sie UseDNS no, / etc / ssh / sshd_config hinzuzufügen

Wenn dies auch bei lokalen Anmeldungen der Fall ist, überprüfen Sie, ob von Ihnen konfigurierte LDAP-Server oder DNS-Server langsam sind oder nicht reagieren.

sCiphre
quelle
6

Eine Möglichkeit (die von anderen Antworten abgedeckt wird) besteht darin, dass beim Einrichten der SSH-Sitzung selbst die Zeit verloren geht.

Eine andere Alternative besteht darin, dass Ihre Shell-Startskripten, die nach dem Aufbau einer SSH-Sitzung auf dem Remotecomputer ausgeführt werden, etwas haben, das lange dauert (möglicherweise wird versucht, auf eine unterbrochene Netzwerkbereitstellung zuzugreifen). Sie können diese zweite Möglichkeit folgendermaßen debuggen:

Fügen Sie vorübergehend Folgendes oben hinzu ~/.bash_profile:

set -x
PS4='+ $(date "+%s.%N")\011 '

Die set -xDrehungen auf einige Debugging für jede Shell - Befehl ausgeführt. Die PS4Variable steuert, wie das Debugging dargestellt wird - speziell in diesem Fall datewerden Zeitstempel hinzugefügt.

Anschließend können Sie die Zeitstempel der Debugging-Ausgabe analysieren, um festzustellen, welche Befehle in Ihren Startskripten zu lange dauern.

Digitales Trauma
quelle
1
True, wenn und nur wenn das Problem auftritt, nachdem die Remote-Sitzung geöffnet wurde. Viele der möglichen Ursachen liegen beim SSH-Handshake und der Authentifizierung vor.
Charles Duffy
2
Sehr verbessert. :)
Charles Duffy
3

Wenn es sich um einen Ubuntu-Server handelt, prüft das Standard-Login-Setup bei jeder Ausführung einer Login-Shell, ob Pakete aktualisierbar sind. Wenn sich die Paketlisten nicht im Festplatten-Cache befinden, kann dies auf einem schnellen, inaktiven Desktop einige Sekunden dauern.

$ ssh localhost 
Welcome to Ubuntu 15.04 (GNU/Linux 3.19.0-26-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

*** System restart required ***
Last login: Sat Sep 12 01:38:38 2015 from localhost

Um diese Meldung "Neustart erforderlich" zu generieren, musste überprüft werden, ob der aktuell ausgeführte Kernel nicht der aktuell installierte Standardkernel ist. (Das heißt, es gab einen Kernel, den ich noch nicht neu gestartet habe.) Außerdem wird eine Anzahl der verfügbaren Sicherheitsupdates gedruckt, sofern vorhanden.

Ich denke, dies ist die größte Verlangsamung bei der Anmeldung bei Ubuntu, die kürzlich eingeführt wurde.

Wenn nicht, dann könnte Ihr ~/.bash_profile/ ~/.bashrcdas Problem sein.

Haben Sie versucht, sich von selbst beim Server anzumelden ( ssh localhost)? Oder gleich ein 2. Mal einloggen? (Um zu sehen, ob es viel schneller ist, wenn Sachen zwischengespeichert werden.)

Peter Cordes
quelle
2

Dies ist in den meisten Fällen eine Zeitüberschreitung einer DNS-Anforderung.

Ursache: Der Server versucht eine umgekehrte DNS-Suche unter Verwendung der IP-Adresse des Clients und erhält keine Antwort. Wenn A eine Verbindung zu B herstellt, versucht B, die IP-Adresse von A in einen Namen zu konvertieren.

Umgehung: Geben Sie die IP-Adresse und den Namen des Clients in die Hosts-Datei des Servers ein.

Lösung: Machen Sie alle Hosts dem DNS-Server bekannt.

Klaus Hartnegg
quelle