Por que demora dezenas de segundos para obter um prompt de shell?

29

É um tipo de ocorrência regular que, após o SSHing para um servidor (ou até mesmo abrir um terminal no meu Mac), o banner de login é impresso imediatamente, mas leva de 10 segundos a um minuto para aparecer o prompt do shell. Depois disso, o desempenho é bom e a latência da rede não é incomum.

Isso não parece ser uma tarefa computacionalmente difícil, que consome muita memória ou que exige muita carga de trabalho. O que está fazendo com todos esses bilhões de ciclos de CPU?

    
por jacobbaer 15.09.2015 / 19:13

5 respostas

33

Algumas coisas podem estar acontecendo aqui. Você pode encontrar a maioria das respostas no manual do seu shell, mas essas são geralmente incrivelmente longas e oblíquas, então ...

As chances são de que seu problema se resume a uma das poucas coisas.

Se o seu perfil ou o seu bashrc tiverem coisas caras, considere reduzi-los.

Se o seu perfil ou bashrc usar uma pesquisa reversa de DNS (para definir o prompt ou algo assim), corrija o DNS ou use o nome do host.

Os shells abrem muitos arquivos, entre outras coisas, durante a inicialização. Se a carga do sistema for alta, ela geralmente será exibida aqui.

Se o banner for pré-autenticação, também poderá ser autenticação (pam, LDAP, etc.) lenta.

Pode não ser nada disso, no entanto. Uma quantidade surpreendente de coisas acontece antes de exibir o prompt!

    
por 15.09.2015 / 19:19
22

Provavelmente está aguardando DNS ou tentando autenticar via LDAP ou algo semelhante.

Tente adicionar UseDNS no a / etc / ssh / sshd_config

Se também for feito em logons locais, verifique se algum servidor LDAP ou servidor DNS configurado está lento ou sem resposta.

    
por 15.09.2015 / 19:21
6

Uma possibilidade (coberta por outras respostas) é que o processo de configuração da própria sessão SSH é onde o tempo é perdido.

Outra alternativa é que os scripts de inicialização do shell em execução na máquina remota após o estabelecimento da sessão SSH possuem algo que está demorando muito (talvez tentando acessar alguma montagem de rede quebrada). Você pode depurar esta segunda possibilidade da seguinte forma:

Adicione temporariamente o seguinte ao topo do seu ~/.bash_profile :

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

O set -x ativa alguma depuração para cada comando do shell executado. A variável PS4 controla como essa depuração é apresentada - especificamente, neste caso, usamos date para adicionar registros de data e hora.

Você pode então analisar os timestamps da saída de depuração para ver quais comandos em seus scripts de inicialização estão demorando demais.

    
por 15.09.2015 / 20:35
3

Se for um servidor Ubuntu, a configuração de login padrão verifica se algum pacote é atualizável toda vez que um shell de login é executado. Se as listas de pacotes não estiverem no cache de disco, isso pode levar um ou dois segundos, mesmo em uma área de trabalho ociosa e rápida.

$ 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 gerar a mensagem "restart required", era necessário verificar se o kernel atualmente em execução não é o kernel padrão atualmente instalado. (isto é, havia um kernel e eu ainda não reinicializei). Ele também imprimirá uma contagem das atualizações de segurança disponíveis, se houver alguma.

Acho que esta é a maior lentidão no login no Ubuntu que foi introduzido recentemente.

Se não for isso, seu ~/.bash_profile / ~/.bashrc pode ser o problema.

Você já tentou fazer login no servidor por si mesmo ( ssh localhost )? Ou entrando na 2ª vez imediatamente? (Para ver se é muito mais rápido quando as coisas são armazenadas em cache.)

    
por 16.09.2015 / 19:57
2

Isso é na maioria dos casos um tempo limite de uma solicitação de DNS.

Causa: o servidor tenta uma pesquisa inversa de DNS usando o endereço IP do cliente e não obtém resposta. Se A se conecta a B, B tenta converter o endereço IP de A em um nome.

Solução alternativa: insira o endereço IP e o nome do cliente no arquivo de hosts do servidor.

Solução: torne todos os hosts conhecidos para o servidor DNS.

    
por 16.09.2015 / 12:15