Mengapa perlu puluhan detik untuk mendapatkan shell prompt?

30

Ini semacam kejadian biasa yang, setelah SSHing ke server (atau bahkan membuka terminal di Mac saya), spanduk masuk dicetak segera tetapi dibutuhkan ~ 10 detik hingga satu menit agar shell prompt muncul. Setelah itu, kinerjanya baik-baik saja dan latensi jaringan tidak biasa.

Ini tidak tampak seperti tugas yang sulit secara komputasi, intensif memori, atau berat-IO. Apa yang dilakukannya dengan semua milyaran siklus CPU itu?

Jacobbaer
sumber
8
ssh -v -v -vdan ur_shell -xmungkin langkah debugging yang bijaksana.
thrig
2
Apakah ada banyak garis di Anda .bash_history?
kasperd
2
Lihatlah file .profile dan terkait Anda (maaf, tidak yakin shell yang Anda gunakan) dan hapus sementara untuk melihat apakah itu meningkatkan hal-hal. Anda mungkin memiliki perintah yang kehabisan waktu.
TheFiddlerWins
3
Atau saran Moby Disk, apakah masih sama lambatnya jika Anda memulai shell itu sendiri dari dalam shell? Jika lambat ketika menghubungkan kembali tetapi cepat ketika memulai shell kedua dari dalam sesi yang terhubung, yang akan memberitahu Anda bahwa itu bukan shell itu sendiri yang menyebabkan kelambatan; jika sama lambatnya dalam kedua situasi, maka sesuatu yang dilakukan shell saat startup membutuhkan banyak waktu. Bagaimanapun Anda belajar beberapa tentang aspek "dari nol ke shell prompt" yang lambat.
CVn
2
Seringkali ini adalah otentikasi GSSAPI yang coba terjadi (yang, jika Anda bukan toko Kerberos, kemungkinan sama sekali tidak berguna). Di lain waktu, ini DNS lookup terbalik.
Charles Duffy

Jawaban:

33

Beberapa hal dapat terjadi di sini. Anda dapat menemukan sebagian besar jawaban dalam manual shell Anda, tetapi biasanya sangat panjang dan miring, jadi ...

Kemungkinannya adalah masalah Anda sampai pada satu dari beberapa hal.

Jika profil atau bashrc Anda memiliki barang mahal, pertimbangkan untuk memangkasnya kembali.

Jika profil atau bashrc Anda menggunakan pencarian DNS terbalik (untuk mengatur prompt atau sesuatu), perbaiki DNS atau gunakan nama host saja.

Kerang membuka banyak file, antara lain, saat inisialisasi. Jika beban sistem tinggi, sering muncul di sini.

Jika spanduk adalah pra-otentikasi, itu mungkin juga sebenarnya otentikasi (pam, LDAP, dll.) Yang lambat.

Mungkin ini bukan salah satu dari hal-hal ini. Sejumlah hal mengejutkan terjadi tepat sebelum menampilkan konfirmasi!

Falcon Momot
sumber
1
Satu lagi saya telah melihat blok untuk sementara waktu sedang dicoba otentikasi GSSAPI (jika tidak dimatikan pada klien SSH atau konfigurasi server). Menggunakan alat pelacak sistem penuh seperti sysdig mungkin adalah peluru perak terbaik yang tersedia untuk sampai ke bagian bawah masalah lintas-masalah semacam ini.
Charles Duffy
+1 Jawaban menyeluruh. Situs ini memiliki diagram alur yang bagus untuk login, file mana yang mereka jalankan / sumber, dan info lainnya.
Tim S.
15
+1. 99% dari waktu bagi saya itu adalah pencarian DNS terbalik.
mpontillo
@ Mike: sama di sini - saya akan merekomendasikan untuk memulai dengan yang satu ini karena mudah diperbaiki. Itu 100% dalam kasus saya.
WoJ
22

Mungkin menunggu DNS atau mencoba mengautentikasi melalui LDAP atau semacamnya.

Coba tambahkan UseDNS noke / etc / ssh / sshd_config

Jika juga melakukannya di log masuk lokal, periksa apakah server LDAP atau server DNS yang Anda konfigurasikan lambat atau tidak responsif.

sCiphre
sumber
6

Satu kemungkinan (dicakup oleh jawaban lain) adalah bahwa proses mengatur sesi SSH itu sendiri adalah di mana waktu hilang.

Alternatif lain adalah bahwa skrip startup shell Anda berjalan pada mesin jarak jauh setelah pembentukan sesi SSH memiliki sesuatu yang memakan waktu lama (mungkin mencoba untuk mengakses beberapa pemasangan jaringan yang rusak). Anda dapat men-debug kemungkinan kedua ini sebagai berikut:

Tambahkan sementara berikut ke bagian atas Anda ~/.bash_profile:

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

The set -xbergantian pada beberapa debugging untuk setiap perintah shell dieksekusi. The PS4kontrol variabel bagaimana yang debugging disajikan - khususnya dalam hal ini kita gunakan dateuntuk menambahkan cap waktu.

Anda kemudian dapat menganalisis cap waktu output debugging untuk melihat perintah mana dalam skrip startup Anda yang terlalu lama.

Trauma Digital
sumber
1
Benar jika dan hanya jika masalah terjadi setelah sesi jarak jauh dibuka. Banyak penyebab potensial selama jabat tangan dan otentikasi SSH.
Charles Duffy
2
Jauh lebih baik. :)
Charles Duffy
3

Jika ini adalah server Ubuntu, pengaturan login default memeriksa apakah ada paket yang dapat diupdate setiap kali shell login berjalan. Jika daftar paket tidak ada dalam cache disk, ini bisa memakan waktu satu atau dua detik bahkan pada desktop cepat idle.

$ 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

Untuk menghasilkan pesan "restart diperlukan", itu harus memeriksa bahwa kernel yang sedang berjalan bukan kernel default yang diinstal saat ini. (Yaitu ada kernel dan saya belum reboot.) Ini juga akan mencetak hitungan pembaruan keamanan yang tersedia, jika ada.

Saya pikir ini adalah kemunduran besar dalam masuk ke Ubuntu yang telah diperkenalkan baru-baru ini.

Jika tidak, maka ~/.bash_profile/ Anda ~/.bashrcmungkin masalahnya.

Sudahkah Anda mencoba masuk ke server dari sendirinya ( ssh localhost)? Atau langsung login ke-2? (Untuk melihat apakah itu jauh lebih cepat ketika barang di-cache.)

Peter Cordes
sumber
2

Dalam kebanyakan kasus, ini adalah batas waktu permintaan DNS.

Penyebab: Server mencoba pencarian DNS terbalik menggunakan alamat IP klien, dan tidak mendapat balasan. Jika A terhubung ke B, B mencoba mengubah alamat IP A menjadi sebuah nama.

Penanganan Masalah: Masukkan alamat IP dan nama klien ke file host dari server.

Solusi: buat semua host diketahui ke server DNS.

Klaus Hartnegg
sumber