Tại sao phải mất hàng chục giây để có được một dấu nhắc shell?


30

Đó là một sự xuất hiện thường xuyên mà sau khi SSH tới máy chủ (hoặc thậm chí mở thiết bị đầu cuối trên máy Mac của tôi), biểu ngữ đăng nhập sẽ in ngay lập tức nhưng phải mất ~ 10 giây đến một phút để dấu nhắc trình bao xuất hiện. Sau đó, hiệu suất vẫn ổn và độ trễ mạng không phải là bất thường.

Đây dường như không phải là một nhiệm vụ khó tính toán, tốn nhiều bộ nhớ hoặc nặng về IO. Nó đang làm gì với tất cả hàng tỷ chu kỳ CPU?


8
ssh -v -v -vur_shell -xcó thể là các bước gỡ lỗi thận trọng.
thrig

2
Có rất nhiều dòng trong của bạn .bash_history?
kasperd

2
Nhìn vào tệp .profile và các tệp có liên quan của bạn (xin lỗi, không chắc chắn bạn đang sử dụng shell nào) và xóa tạm thời để xem điều đó có cải thiện mọi thứ không. Bạn có thể có một lệnh đã hết thời gian.
TheFiddlerWins

3
Ngoài ra, theo gợi ý của Moby Disk, nó vẫn chậm như nhau nếu bạn tự khởi động vỏ từ bên trong vỏ? Nếu nó chậm khi (tái) kết nối nhưng nhanh khi bắt đầu lớp thứ hai từ trong phiên được kết nối, hiện có, điều đó sẽ cho bạn biết rằng chính lớp vỏ đó không gây ra sự chậm chạp; nếu nó chậm như nhau trong hai tình huống, thì cái gì đó mà shell thực hiện khi khởi động đang mất rất nhiều thời gian. Dù bằng cách nào bạn cũng tìm hiểu một số khía cạnh của "từ 0 đến shell prompt" là chậm.
một CVn

2
Thường thì đây là xác thực GSSAPI đang cố xảy ra (mà nếu bạn không phải là cửa hàng Kerberos, có khả năng hoàn toàn vô dụng). Lần khác, đó là tra cứu ngược DNS.
Charles Duffy

Câu trả lời:


33

Khá nhiều điều có thể xảy ra ở đây. Bạn có thể tìm thấy hầu hết các câu trả lời trong hướng dẫn sử dụng của bạn, nhưng những câu trả lời thường dài và xiên, vì vậy ...

Rất có thể vấn đề của bạn là một trong một vài điều.

Nếu hồ sơ hoặc bashrc của bạn có những thứ đắt tiền, hãy xem xét cắt tỉa chúng lại.

Nếu hồ sơ hoặc bashrc của bạn sử dụng tra cứu DNS ngược (để đặt lời nhắc hoặc một cái gì đó), hãy sửa DNS hoặc sử dụng tên máy chủ thay thế.

Shell mở rất nhiều tệp, trong số những thứ khác, trong khi khởi tạo. Nếu tải hệ thống cao, nó sẽ thường hiển thị ở đây.

Nếu biểu ngữ là xác thực trước, thì nó cũng có thể là xác thực (pam, LDAP, v.v.) chậm.

Nó có thể không phải là những điều này, mặc dù. Một số lượng đáng ngạc nhiên của công cụ xảy ra ngay trước khi hiển thị lời nhắc!


1
Một khối khác mà tôi đã thấy trong một thời gian đáng kể đã thử xác thực GSSAPI (nếu không tắt cấu hình máy khách SSH hoặc máy chủ). Sử dụng một công cụ theo dõi toàn hệ thống như sysdig có lẽ là viên đạn bạc tốt nhất hiện có để đi đến tận cùng của loại vấn đề liên quan này.
Charles Duffy

+1 Trả lời kỹ lưỡng. Trang web này có một sơ đồ đẹp cho thông tin đăng nhập, tập tin nào họ thực thi / nguồn và thông tin khác.
Tim S.

15
+1. 99% thời gian đối với tôi đó là tra cứu DNS ngược.
mpontillo

@Mike: tương tự ở đây - Tôi khuyên bạn nên bắt đầu với cái này vì nó rất dễ sửa. Đó là 100% trong trường hợp của tôi.
WoJ

22

Có lẽ họ đang chờ DNS hoặc cố gắng xác thực thông qua LDAP hoặc như vậy.

Cố gắng thêm UseDNS novào / etc / ssh / sshd_config

Nếu nó cũng thực hiện trên các đăng nhập cục bộ, hãy kiểm tra xem bất kỳ máy chủ LDAP hoặc máy chủ DNS nào bạn đã định cấu hình có chậm hoặc không phản hồi không.


6

Một khả năng (được bao phủ bởi các câu trả lời khác) là quá trình thiết lập phiên SSH chính là nơi mất thời gian.

Một cách khác là các tập lệnh khởi động shell của bạn chạy trên máy từ xa sau khi thiết lập phiên SSH có một cái gì đó mất nhiều thời gian (có lẽ đang cố truy cập vào một số kết nối mạng bị hỏng). Bạn có thể gỡ lỗi khả năng thứ hai này như sau:

Tạm thời thêm các mục sau vào đầu trang của bạn ~/.bash_profile:

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

Việc set -xbật một số gỡ lỗi cho mỗi lệnh shell được thực thi. Các PS4điều khiển biến cách gỡ lỗi được trình bày - đặc biệt là trong trường hợp này chúng tôi sử dụng dateđể thêm timestamps.

Sau đó, bạn có thể phân tích dấu thời gian của đầu ra gỡ lỗi để xem lệnh nào trong tập lệnh khởi động của bạn mất quá nhiều thời gian.


1
Đúng khi và chỉ khi sự cố xảy ra sau khi phiên từ xa được mở. Nhiều nguyên nhân tiềm ẩn là trong quá trình bắt tay và xác thực SSH.
Charles Duffy

2
Cải thiện nhiều. :)
Charles Duffy

3

Nếu đó là máy chủ Ubuntu, thiết lập đăng nhập mặc định sẽ kiểm tra xem có gói nào được cập nhật mỗi khi vỏ đăng nhập chạy không. Nếu danh sách gói không có trong bộ đệm đĩa, việc này có thể mất một hoặc hai giây ngay cả trên máy tính để bàn nhanh.

$ 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

Để tạo thông báo "yêu cầu khởi động lại" đó, nó phải kiểm tra xem kernel hiện đang chạy không phải là kernel mặc định hiện đang được cài đặt. (tức là đã có kernel và tôi chưa khởi động lại.) Nó cũng sẽ in một số bản cập nhật bảo mật có sẵn, nếu có.

Tôi nghĩ rằng đây là sự chậm chạp lớn trong việc đăng nhập vào Ubuntu đã được giới thiệu gần đây.

Nếu không, thì ~/.bash_profile/ ~/.bashrccó thể bạn là vấn đề.

Bạn đã thử đăng nhập vào máy chủ từ chính nó ( ssh localhost) chưa? Hoặc đăng nhập lần thứ 2 ngay lập tức? (Để xem nó có nhanh hơn nhiều khi công cụ được lưu trữ không.)


2

Điều này trong hầu hết các trường hợp là hết thời gian yêu cầu DNS.

Nguyên nhân: Máy chủ cố gắng tra cứu DNS ngược bằng địa chỉ IP của máy khách và không nhận được phản hồi. Nếu A kết nối với B, B cố gắng chuyển đổi địa chỉ IP của A thành tên.

Giải pháp thay thế: Nhập Địa chỉ IP và tên của máy khách vào tệp máy chủ của máy chủ.

Giải pháp: làm cho tất cả các máy chủ được biết đến máy chủ DNS.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.