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

30

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

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

jacobbaer
fonte
8
ssh -v -v -ve ur_shell -xpodem ser etapas prudentes de depuração.
thrig
2
Há muitas linhas no seu .bash_history?
precisa saber é
2
Olhe para os arquivos .profile e relacionados (desculpe, não sei qual shell você está usando) e remova temporariamente para ver se isso melhora as coisas. Você provavelmente tem um comando que está atingindo o tempo limite.
TheFiddlerWins
3
Como alternativa à sugestão do Moby Disk, ainda é igualmente lento se você iniciar o próprio shell de dentro dele? Se for lento quando (re) conectar, mas rápido ao iniciar um segundo shell a partir de uma sessão conectada existente, isso indicará que não é o próprio shell que está causando a lentidão; se for igualmente lento nas duas situações, algo que o shell faz na inicialização está demorando muito tempo. De qualquer maneira, você aprende um pouco sobre qual aspecto de "do zero ao prompt do shell" é lento.
um CVn
2
Geralmente, é a tentativa de autenticação GSSAPI (que, se você não é uma loja Kerberos, provavelmente é completamente inútil). Outras vezes, são pesquisas reversas de DNS.
Charles Duffy

Respostas:

33

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

Provavelmente, seu problema se resume a uma das poucas coisas.

Se seu perfil ou bashrc tiver coisas caras, considere recortá-las.

Se o seu perfil ou bashrc usar uma pesquisa DNS reversa (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 aparecerá aqui.

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

Pode não ser nenhuma dessas coisas, no entanto. Uma quantidade surpreendente de coisas acontece logo antes de exibir o prompt!

Falcon Momot
fonte
11
Outro que eu já vi bloquear por um tempo substancial é a tentativa de autenticação GSSAPI (se não estiver desativada na configuração do cliente ou servidor SSH). O uso de uma ferramenta de rastreamento de sistema completo, como o sysdig, é provavelmente a melhor bala de prata disponível para chegar ao fundo desse tipo de problema de preocupação cruzada.
Charles Duffy
+1 resposta completa. Este site possui um bom fluxograma para logins, quais arquivos eles executam / origem e outras informações.
Tim S.
15
+1. 99% do tempo para mim é a pesquisa reversa de DNS.
mpontillo
@ Mike: mesmo aqui - eu recomendaria começar com este, pois é fácil de corrigir. Foi 100% no meu caso.
WoJ
22

Provavelmente, está esperando pelo DNS ou tentando se autenticar via LDAP ou algo assim.

Tente adicionar UseDNS noao / etc / ssh / sshd_config

Se isso também ocorrer em logons locais, verifique se algum servidor LDAP ou DNS configurado por você está lento ou não responde.

sCiphre
fonte
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 tenham algo demorado (talvez tentando acessar alguma montagem de rede quebrada). Você pode depurar essa segunda possibilidade da seguinte maneira:

Adicione temporariamente o seguinte à parte superior do seu ~/.bash_profile:

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

As set -xvoltas sobre alguma depuração para cada comando shell executado. A PS4variável controla como essa depuração é apresentada - especificamente neste caso, usamos datepara adicionar registros de data e hora.

Você pode analisar os carimbos de data e hora da saída de depuração para ver quais comandos nos scripts de inicialização estão demorando muito.

Trauma Digital
fonte
11
Verdadeiro se e somente se o problema ocorrer após a abertura da sessão remota. Muitas das causas possíveis são durante o handshake e a autenticação SSH.
Charles Duffy
2
Bastante aperfeiçoado. :)
Charles Duffy
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 do disco, isso pode levar um ou dois segundos em uma área de trabalho inativa 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 essa mensagem "reiniciar necessário", era necessário verificar se o kernel atualmente em execução não é o kernel padrão atualmente instalado. (ou seja, havia um kernel e eu ainda não reinicializei.) Ele também imprimirá uma contagem de atualizações de segurança disponíveis, se houver alguma.

Eu acho que essa é a maior desaceleração no login no Ubuntu que foi introduzida recentemente.

Caso contrário, seu ~/.bash_profile/~/.bashrc pode ser o problema.

Você já tentou fazer login no servidor por conta própria ( ssh localhost)? Ou logando pela segunda vez imediatamente? (Para ver se é muito mais rápido quando o material é armazenado em cache.)

Peter Cordes
fonte
2

Na maioria dos casos, esse é o tempo limite de uma solicitação de DNS.

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

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

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

Klaus Hartnegg
fonte