Frage Warum braucht es mehrere Sekunden, um eine Shell-Eingabeaufforderung zu erhalten?


Es ist eine Art regelmäßiges Ereignis, dass nach dem SSHing zu einem Server (oder sogar dem Öffnen eines Terminals auf meinem Mac) das Login-Banner sofort gedruckt wird, aber es dauert ~ 10 Sekunden bis eine Minute, bis die Shell-Eingabeaufforderung erscheint. Danach ist die Leistung in Ordnung und Netzwerklatenz ist nicht ungewöhnlich.

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


29
2017-09-15 17:13


Ursprung


ssh -v -v -v und ur_shell -x könnte vorsichtig Debugging-Schritte sein. - thrig
Gibt es viele Zeilen in Ihrem .bash_history? - kasperd
Sehen Sie sich Ihre .profile-Datei und die zugehörigen Dateien an (Sie wissen nicht, welche Shell Sie verwenden) und entfernen Sie sie vorübergehend, um zu sehen, ob dies die Dinge verbessert. Sie haben wahrscheinlich einen Befehl, der ausläuft. - TheFiddlerWins
Alternativ zu Moby Disk Vorschlag, ist es immer noch genauso langsam, wenn Sie die Shell selbst aus der Shell starten? Wenn es langsam ist, wenn man (wieder) verbindet, aber schnell, wenn man eine zweite Shell aus einer bestehenden, verbundenen Sitzung heraus startet, wird das sagen, dass es nicht die Shell selbst ist, die die Langsamkeit verursacht; Wenn es in beiden Situationen gleichermaßen langsam ist, braucht etwas, was die Shell beim Start macht, viel Zeit. So oder so erfahren Sie etwas darüber, welcher Aspekt von "von Null auf Shell" langsam ist. - α CVn
Oftmals versucht dies die GSSAPI-Authentifizierung (was, wenn Sie kein Kerberos-Shop sind, wahrscheinlich völlig nutzlos ist). In anderen Fällen sind es DNS-Reverse-Lookups. - Charles Duffy


Antworten:


Hier könnte einiges passieren. Die meisten Antworten finden Sie im Handbuch Ihrer Shell, aber diese sind normalerweise unglaublich lang und schräg, also ...

Wahrscheinlichkeiten sind dein Problem, das auf eines von wenigen Dingen läuft.

Wenn Ihr Profil oder Bashrc teure Dinge haben, sollten Sie sie zurückschneiden.

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

Shells öffnen unter anderem während der Initialisierung viele Dateien. Wenn die Systemlast hoch ist, wird es oft hier angezeigt.

Wenn das Banner eine Vorauthentifizierung ist, ist es möglicherweise auch eine Authentifizierung (PAM, LDAP usw.), die langsam ist.

Es könnte jedoch keines dieser Dinge sein. Eine erstaunliche Menge von Sachen passiert direkt vor der Anzeige der Aufforderung!


33
2017-09-15 17:19



Ein weiterer Block, den ich seit längerer Zeit gesehen habe, ist die versuchte GSSAPI-Authentifizierung (wenn nicht auf der SSH-Client- oder Server-Konfiguration ausgeschaltet). Die Verwendung eines vollständigen System-Tracing-Tools wie sysdig ist wahrscheinlich der beste Weg, um diese Art von Cross-Concern-Problemen auf den Grund zu gehen. - Charles Duffy
+1 gründliche Antwort. Diese Seite hat ein schönes Flussdiagramm für Logins, welche Dateien sie ausführen / Quelle und andere Informationen. - Tim S.
+1. 99% der Zeit ist für mich 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. - WoJ


Es wartet wahrscheinlich entweder auf DNS oder versucht, sich über LDAP oder ähnliches zu authentifizieren.

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

Wenn dies auch bei lokalen Anmeldungen geschieht, überprüfen Sie, ob LDAP-Server oder DNS-Server, die Sie konfiguriert haben, langsam sind oder nicht reagieren.


22
2017-09-15 17:21





Eine Möglichkeit (die durch andere Antworten abgedeckt wird) ist, dass der Prozess des Einrichtens der SSH-Sitzung selbst dort stattfindet, wo die Zeit verloren geht.

Eine andere Alternative ist, dass Ihre Shell-Startskripte, die nach der Einrichtung der SSH-Sitzung auf dem Remote-Rechner ausgeführt werden, etwas haben, das sehr lange dauert (vielleicht versuchen Sie, auf einen beschädigten Netzwerk-Mount zuzugreifen). Sie können diese zweite Möglichkeit wie folgt debuggen:

Fügen Sie vorübergehend Folgendes an die Spitze Ihres ~/.bash_profile:

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

Das set -x aktiviert jedes Debugging für jeden ausgeführten Shellbefehl. Das PS4 Variable steuert, wie das Debugging dargestellt wird - speziell in diesem Fall verwenden wir date Zeitstempel hinzufügen.

Sie können dann die Zeitstempel der Debugausgabe analysieren, um zu sehen, welche Befehle in Ihren Startskripten zu lange dauern.


6
2017-09-15 18:35



True, wenn und nur wenn das Problem nach dem Öffnen der Remote-Sitzung auftritt. Viele der möglichen Ursachen sind SSH-Handshake und Authentifizierung. - Charles Duffy
Sehr verbessert. :) - Charles Duffy


Wenn es sich um einen Ubuntu-Server handelt, überprüft das Standard-Anmelde-Setup, ob Pakete bei jeder Ausführung einer Login-Shell aktualisiert werden können. Wenn sich die Paketlisten nicht im Festplatten-Cache befinden, kann dies auch auf einem schnellen Leerlauf-Desktop ein oder zwei 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, dass der aktuell ausgeführte Kernel nicht der standardmäßig installierte Kernel ist. (d. h., es gab einen Kernel und ich habe noch keinen Neustart durchgeführt.) Es wird auch eine Anzahl von verfügbaren Sicherheitsupdates gedruckt, falls es welche gibt.

Ich denke, dies ist die große Verlangsamung beim Einloggen in Ubuntu, die kürzlich eingeführt wurde.

Wenn nicht das, dann dein ~/.bash_profile / ~/.bashrc könnte das Problem sein.

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


3
2017-09-16 17:57





Das ist in den meisten Fällen ein Timeout einer DNS-Anfrage

Ursache: Der Server versucht eine umgekehrte DNS-Suche mit 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 umzuwandeln.

Problemumgehung: 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.


2
2017-09-16 10:15