Perché ci vogliono decine di secondi per ottenere un prompt della shell?


30

È una sorta di ricorrenza normale che, dopo aver eseguito l'SSHing su un server (o anche aprendo un terminale sul mio Mac), il banner di accesso venga stampato immediatamente ma occorrono ~ 10 secondi a un minuto affinché appaia il prompt della shell. Successivamente, le prestazioni vanno bene e la latenza di rete non è insolita.

Questo non sembra un compito complicato dal punto di vista computazionale, dispendioso in termini di memoria o pesantemente IO. Che cosa sta facendo con tutti quei miliardi di cicli della CPU?


8
ssh -v -v -ve ur_shell -xpotrebbe essere una procedura di debug prudente.
thrig

2
Ci sono molte righe nella tua .bash_history?
Kasperd,

2
Guarda il tuo .profile e i file correlati (scusami, non sono sicuro di quale shell stai usando) e rimuovi temporaneamente per vedere se questo migliora le cose. Probabilmente hai un comando che sta scadendo.
TheFiddler vince il

3
In alternativa al suggerimento di Moby Disk, è ancora altrettanto lento se si avvia la shell stessa dall'interno della shell? Se è lento quando (ri) connettersi ma veloce quando si avvia una seconda shell da una sessione esistente connessa, ciò ti dirà che non è la shell stessa a causare la lentezza; se è ugualmente lento nelle due situazioni, qualcosa che la shell fa all'avvio richiede molto tempo. Ad ogni modo, apprendi alcuni aspetti di quale aspetto del "da zero al prompt della shell" è lento.
un CVn,

2
Spesso si tratta dell'autenticazione GSSAPI che tenta di verificarsi (che, se non sei un negozio Kerberos, è probabilmente completamente inutile). Altre volte, sono le ricerche inverse DNS.
Charles Duffy,

Risposte:


33

Qui potrebbero succedere molte cose. Puoi trovare la maggior parte delle risposte nel manuale della tua shell, ma di solito sono incredibilmente lunghe e oblique, quindi ...

Le probabilità sono che il tuo problema si riduce a una delle poche cose.

Se il tuo profilo o bashrc hanno cose costose, considera di ridurle.

Se il tuo profilo o bashrc usano una ricerca DNS inversa (per impostare il prompt o qualcosa del genere), correggi DNS o usa invece il nome host.

Le shell aprono molti file, tra le altre cose, durante l'inizializzazione. Se il carico di sistema è elevato, spesso verrà visualizzato qui.

Se il banner è pre-autenticazione, potrebbe anche essere un'autenticazione (pam, LDAP, ecc.) Che è lenta.

Potrebbe non essere nessuna di queste cose, però. Una quantità sorprendente di cose accade proprio prima di visualizzare il prompt!


1
Un altro blocco che ho visto per un lungo periodo è il tentativo di autenticazione GSSAPI (se non disattivato sul client SSH o sulla configurazione del server). L'utilizzo di uno strumento di tracciamento dell'intero sistema come sysdig è probabilmente il miglior proiettile d'argento disponibile per arrivare alla fine di questo tipo di problema di interesse incrociato.
Charles Duffy,

+1 Risposta approfondita. Questo sito ha un bel diagramma di flusso per gli accessi, quali file eseguono / sorgente e altre informazioni.
Tim S.

15
+1. Il 99% delle volte per me è la ricerca DNS inversa.
mpontillo,

@Mike: stesso qui - consiglierei di iniziare con questo in quanto è facile da risolvere. Nel mio caso era al 100%.
WoJ,

22

Probabilmente sta aspettando il DNS o sta provando ad autenticarsi tramite LDAP o simili.

Prova ad aggiungere UseDNS noa / etc / ssh / sshd_config

Se lo fa anche su accessi locali, verificare se i server LDAP o DNS configurati sono lenti o non rispondono.


6

Una possibilità (coperta da altre risposte) è che il processo di impostazione della sessione SSH stessa è dove si perde il tempo.

Un'altra alternativa è che gli script di avvio della shell in esecuzione sul computer remoto dopo l'istituzione della sessione SSH hanno qualcosa che richiede molto tempo (forse tentando di accedere a un montaggio di rete interrotto). È possibile eseguire il debug di questa seconda possibilità come segue:

Aggiungi temporaneamente quanto segue all'inizio del tuo ~/.bash_profile:

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

Le set -xspire di debugging per ogni comando shell eseguiti. La PS4variabile controlla come viene presentato il debug, in particolare in questo caso utilizziamo dateper aggiungere timestamp.

È quindi possibile analizzare i timestamp dell'output di debug per vedere quali comandi negli script di avvio impiegano troppo tempo.


1
Vero se e solo se il problema si verifica dopo l'apertura della sessione remota. Molte delle potenziali cause sono durante l'handshake e l'autenticazione SSH.
Charles Duffy,

2
Molto migliorato :)
Charles Duffy,

3

Se si tratta di un server Ubuntu, l'impostazione di accesso predefinita verifica se eventuali pacchetti sono aggiornabili ogni volta che viene eseguita una shell di accesso. Se gli elenchi dei pacchetti non si trovano nella cache del disco, questo può richiedere un secondo o due anche su un desktop inattivo veloce.

$ 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

Per generare quel messaggio "riavvio richiesto", è stato necessario verificare che il kernel attualmente in esecuzione non sia il kernel predefinito attualmente installato. (cioè c'era un kernel e non ho ancora riavviato.) Stampa anche un numero di aggiornamenti di sicurezza disponibili, se ce ne sono.

Penso che questo sia il principale rallentamento dell'accesso a Ubuntu che è stato introdotto di recente.

In caso contrario, il tuo ~/.bash_profile/ ~/.bashrcpotrebbe essere il problema.

Hai provato ad accedere al server da solo ( ssh localhost)? O accedi subito una seconda volta? (Per vedere se è molto più veloce quando le cose sono memorizzate nella cache.)


2

Questo è nella maggior parte dei casi un timeout di una richiesta DNS.

Causa: il server tenta una ricerca DNS inversa utilizzando l'indirizzo IP del client e non ottiene una risposta. Se A si connette a B, B prova a convertire l'indirizzo IP di A in un nome.

Soluzione alternativa: immettere l'indirizzo IP e il nome del client nel file hosts del server.

Soluzione: far conoscere tutti gli host al server DNS.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.