Dlaczego wyświetlenie monitu powłoki zajmuje kilkadziesiąt sekund?

30

Jest to rodzaj regularnego zdarzenia, że ​​po SSHing do serwera (lub nawet otwarciu terminala na moim komputerze Mac) baner logowania jest drukowany natychmiast, ale wyświetlenie monitu powłoki zajmuje około 10 sekund do minuty. Po tym wydajność jest w porządku, a opóźnienie sieci nie jest niczym niezwykłym.

Nie wydaje się to zadaniem trudnym obliczeniowo, wymagającym dużej ilości pamięci lub dużym obciążeniem IO. Co robi z tymi wszystkimi miliardami cykli procesora?

jacobbaer
źródło
8
ssh -v -v -vi ur_shell -xmogą to być ostrożne kroki debugowania.
thrig
2
Czy masz dużo linii .bash_history?
kasperd
2
Przejrzyj plik .profile i powiązane pliki (przepraszam, nie wiem, której powłoki używasz) i tymczasowo usuń, aby sprawdzić, czy to poprawi sytuację. Prawdopodobnie masz polecenia, które wygasają.
TheFiddlerWins
3
Alternatywnie do sugestii Moby Disk, czy nadal jest on równie wolny, jeśli uruchamiasz samą powłokę z poziomu powłoki? Jeśli jest powolny podczas (ponownego) łączenia, ale szybki podczas uruchamiania drugiej powłoki z istniejącej, połączonej sesji, to powie ci, że to nie sama powłoka powoduje powolność; jeśli w obu sytuacjach jest on równie powolny, to coś, co powłoka robi przy starcie, zajmuje dużo czasu. Tak czy inaczej dowiesz się, który aspekt „od zera do zachęty powłoki” jest powolny.
CVn
2
Często jest to próba uwierzytelnienia GSSAPI (co, jeśli nie jesteś sklepem Kerberos, jest prawdopodobnie całkowicie bezużyteczne). Innym razem są to wyszukiwania wsteczne DNS.
Charles Duffy,

Odpowiedzi:

33

Mogło się tu wydarzyć kilka rzeczy. Większość odpowiedzi znajdziesz w podręczniku powłoki, ale są one zazwyczaj bardzo długie i ukośne, więc ...

Możliwe, że twój problem sprowadza się do jednej z kilku rzeczy.

Jeśli Twój profil lub bashrc zawierają drogie rzeczy, rozważ przycięcie ich z powrotem.

Jeśli Twój profil lub bashrc używają odwrotnego wyszukiwania DNS (aby ustawić monit lub coś takiego), napraw DNS lub użyj nazwy hosta.

Powłoki otwierają wiele plików, między innymi podczas inicjowania. Jeśli obciążenie systemu jest wysokie, często się tu pojawia.

Jeśli baner jest wstępnie uwierzytelniany, może to być również powolne uwierzytelnianie (pam, LDAP itp.).

Może to jednak nie być żadna z tych rzeczy. Zaskakująca ilość rzeczy dzieje się tuż przed wyświetleniem monitu!

Falcon Momot
źródło
1
Kolejnym, który widziałem blok od dłuższego czasu, jest próba uwierzytelnienia GSSAPI (jeśli nie jest wyłączona na kliencie SSH lub w konfiguracji serwera). Korzystanie z narzędzia do śledzenia całego systemu, takiego jak sysdig, jest prawdopodobnie najlepszą dostępną srebrną kulą, aby dotrzeć do sedna tego rodzaju problemów.
Charles Duffy,
+1 Dokładna odpowiedź. Ta strona ma ładny schemat blokowy dla loginów, plików, które wykonują / źródła oraz innych informacji.
Tim S.
15
+1. 99% czasu to dla mnie odwrotne wyszukiwanie DNS.
mpontillo
@Mike: to samo tutaj - polecam zacząć od tego, ponieważ łatwo go naprawić. W moim przypadku było to 100%.
WoJ
22

Prawdopodobnie czeka albo na DNS, albo próbuje się uwierzytelnić przez LDAP.

Spróbuj dodać UseDNS nodo / etc / ssh / sshd_config

Jeśli robi to również przy logowaniu lokalnym, sprawdź, czy skonfigurowane serwery LDAP lub DNS są wolne lub nie odpowiadają.

sCiphre
źródło
6

Jedną z możliwości (objętych innymi odpowiedziami) jest to, że sam proces konfigurowania sesji SSH jest miejscem, w którym czas jest tracony.

Inną alternatywą jest to, że skrypty startowe powłoki działające na zdalnym komputerze po ustanowieniu sesji SSH mają coś, co zajmuje dużo czasu (być może próba uzyskania dostępu do zepsutego podłączenia sieciowego). Tę drugą możliwość możesz debugować w następujący sposób:

Tymczasowo dodaj na górze ~/.bash_profile:

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

Te set -xobroty na jakiś debugowania dla każdego polecenia powłoki wykonane. Te PS4kontrole zmienne, jak to jest przedstawione debugowanie - specjalnie w tym przypadku używamy date, aby dodać znaczniki czasu.

Następnie możesz przeanalizować sygnatury czasowe danych wyjściowych debugowania, aby zobaczyć, które polecenia w skryptach startowych trwają zbyt długo.

Cyfrowa trauma
źródło
1
Prawda tylko wtedy, gdy problem występuje po otwarciu sesji zdalnej. Wiele potencjalnych przyczyn ma miejsce podczas uzgadniania SSH i uwierzytelniania.
Charles Duffy,
2
Bardzo ulepszony. :)
Charles Duffy,
3

Jeśli jest to serwer Ubuntu, domyślna konfiguracja logowania sprawdza, czy można aktualizować pakiety przy każdym uruchomieniu powłoki logowania. Jeśli listy pakietów nie znajdują się w pamięci podręcznej dysku, może to zająć sekundę lub dwie nawet na szybkim bezczynnym pulpicie.

$ 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

Aby wygenerować ten komunikat „wymagane ponowne uruchomienie”, musiał sprawdzić, czy aktualnie uruchomione jądro nie jest domyślnym jądrem aktualnie zainstalowanym. (tj. było jądro i jeszcze się nie zrestartowałem). Spowoduje to również wydrukowanie liczby dostępnych aktualizacji zabezpieczeń, jeśli takie istnieją.

Myślę, że jest to główne spowolnienie logowania do Ubuntu, które zostało wprowadzone niedawno.

Jeśli nie to, problem może stanowić Twój ~/.bash_profile/ ~/.bashrc.

Czy próbowałeś zalogować się na serwerze z samego siebie ( ssh localhost)? Lub logujesz się od razu po raz drugi? (Aby sprawdzić, czy jest dużo szybciej, gdy rzeczy są buforowane).

Peter Cordes
źródło
2

W większości przypadków jest to limit czasu żądania DNS.

Przyczyna: Serwer próbuje odwrócić wyszukiwanie DNS przy użyciu adresu IP klienta i nie otrzymuje odpowiedzi. Jeśli A łączy się z B, B próbuje przekonwertować adres IP A na nazwę.

Obejście: Wprowadź adres IP i nazwę klienta do pliku hosts na serwerze.

Rozwiązanie: powiadom wszystkie serwery DNS o serwerze DNS.

Klaus Hartnegg
źródło