¿Por qué se tarda decenas de segundos en obtener un indicador de shell?

30

Es una especie de ocurrencia regular que, después de SSHing a un servidor (o incluso abrir un terminal en mi Mac), el banner de inicio de sesión se imprime inmediatamente, pero tarda ~ 10 segundos a un minuto para que aparezca el indicador de shell. Después de eso, el rendimiento es bueno y la latencia de red no es inusual.

Esto no parece una tarea computacionalmente difícil, que requiera mucha memoria o una gran cantidad de IO. ¿Qué está haciendo con todos esos miles de millones de ciclos de CPU?

jacobbaer
fuente
8
ssh -v -v -vy ur_shell -xpodrían ser pasos de depuración prudentes.
thrig
2
¿Hay muchas líneas en tu .bash_history?
kasperd
2
Mire su .profile y los archivos relacionados (lo siento, no estoy seguro de qué shell está usando) y elimine temporalmente para ver si eso mejora las cosas. Probablemente tenga un comando (s) que están agotando el tiempo de espera.
TheFiddler gana el
3
Alternativamente a la sugerencia de Moby Disk, ¿sigue siendo igualmente lento si inicia el shell desde dentro del shell? Si es lento cuando se (re) conecta pero rápido cuando se inicia un segundo shell desde una sesión existente conectada, eso le indicará que no es el shell en sí mismo el que está causando la lentitud; Si es igualmente lento en las dos situaciones, entonces algo que hace el shell en el inicio lleva mucho tiempo. De cualquier manera, aprende algo sobre qué aspecto de "de cero a shell prompt" es lento.
un CVn
2
A menudo, esta es la autenticación GSSAPI que intenta ocurrir (lo cual, si no eres una tienda Kerberos, probablemente sea completamente inútil). Otras veces, son búsquedas inversas de DNS.
Charles Duffy

Respuestas:

33

Muchas cosas podrían estar sucediendo aquí. Puede encontrar la mayoría de las respuestas en el manual de su shell, pero generalmente son increíblemente largas y oblicuas, así que ...

Lo más probable es que su problema se reduzca a una de algunas cosas.

Si su perfil o bashrc tienen cosas caras, considere recortarlas.

Si su perfil o bashrc usa una búsqueda inversa de DNS (para configurar el indicador o algo), arregle DNS o use el nombre de host en su lugar.

Los shells abren muchos archivos, entre otras cosas, mientras se inicializan. Si la carga del sistema es alta, a menudo aparecerá aquí.

Si el banner es autenticación previa, también podría ser una autenticación lenta (pam, LDAP, etc.).

Sin embargo, podría no ser ninguna de estas cosas. ¡Una cantidad sorprendente de cosas sucede justo antes de mostrar el aviso!

Falcon Momot
fuente
1
Otra que he visto bloquearse durante un tiempo considerable es la autenticación GSSAPI (si no está desactivada en la configuración del cliente SSH o del servidor). El uso de una herramienta de rastreo de sistema completo como sysdig es probablemente la mejor bala de plata disponible para llegar al fondo de este tipo de problema de interés cruzado.
Charles Duffy
+1 respuesta completa. Este sitio tiene un buen diagrama de flujo para inicios de sesión, qué archivos ejecutan / fuente y otra información.
Tim S.
15
+1. El 99% del tiempo para mí es la búsqueda inversa de DNS.
mpontillo
@ Mike: lo mismo aquí: recomendaría comenzar con este, ya que es fácil de solucionar. Fue 100% en mi caso.
WoJ
22

Probablemente esté esperando DNS o tratando de autenticarse a través de LDAP o similar.

Intente agregar UseDNS noa / etc / ssh / sshd_config

Si también lo hace en inicios de sesión locales, verifique si los servidores LDAP o DNS que ha configurado son lentos o no responden.

sCiphre
fuente
6

Una posibilidad (cubierta por otras respuestas) es que el proceso de configuración de la sesión SSH es donde se pierde el tiempo.

Otra alternativa es que los scripts de inicio de shell que se ejecutan en la máquina remota después del establecimiento de la sesión SSH tienen algo que lleva mucho tiempo (tal vez intentando acceder a un montaje de red roto). Puede depurar esta segunda posibilidad de la siguiente manera:

Agregue temporalmente lo siguiente a la parte superior de su ~/.bash_profile:

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

Las set -xvueltas en alguna depuración para cada comando shell ejecutados. La PS4variable controla cómo se presenta esa depuración, específicamente en este caso, la usamos datepara agregar marcas de tiempo.

A continuación, puede analizar las marcas de tiempo de la salida de depuración para ver qué comandos en sus scripts de inicio tardan demasiado.

Trauma digital
fuente
1
Verdadero si y solo si el problema ocurre después de que se abre la sesión remota. Muchas de las causas potenciales se producen durante el protocolo de enlace SSH y la autenticación.
Charles Duffy
2
Mucho mejor. :)
Charles Duffy
3

Si se trata de un servidor Ubuntu, la configuración de inicio de sesión predeterminada verifica si algún paquete es actualizable cada vez que se ejecuta un shell de inicio de sesión. Si las listas de paquetes no están en la memoria caché del disco, esto puede tomar uno o dos segundos incluso en un escritorio inactivo rápido.

$ 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

Para generar ese mensaje de "reinicio requerido", tenía que verificar que el núcleo actualmente en ejecución no sea el núcleo predeterminado actualmente instalado. (es decir, había un kernel y aún no reinicié). También imprimirá un recuento de actualizaciones de seguridad disponibles, si hay alguna.

Creo que esta es la mayor desaceleración en el inicio de sesión en Ubuntu que se ha introducido recientemente.

Si no es así, entonces su ~/.bash_profile/ ~/.bashrcpodría ser el problema.

¿Has intentado iniciar sesión en el servidor desde sí mismo ( ssh localhost)? ¿O iniciar sesión por segunda vez de inmediato? (Para ver si es mucho más rápido cuando las cosas se almacenan en caché).

Peter Cordes
fuente
2

Esto es en la mayoría de los casos un tiempo de espera de una solicitud de DNS.

Causa: el servidor intenta una búsqueda inversa de DNS utilizando la dirección IP del cliente y no recibe una respuesta. Si A se conecta a B, B intenta convertir la dirección IP de A en un nombre.

Solución alternativa: ingrese la dirección IP y el nombre del cliente en el archivo de hosts del servidor.

Solución: haga que todos los hosts sean conocidos por el servidor DNS.

Klaus Hartnegg
fuente