为什么要花几十秒钟才能得到shell提示?


30

这是一种常见的情况,在通过SSH连接到服务器(甚至在我的Mac上打开终端)后,登录横幅会立即打印出来,但需要大约10秒钟到一分钟的时间来显示shell提示。之后,性能会很好,网络延迟也很正常。

这似乎不像计算上的困难,占用大量内存或IO繁重的任务。这数十亿个CPU周期在做什么?


8
ssh -v -v -v并且ur_shell -x可能是谨慎的调试步骤。
2015年

2
您的行中有很多行.bash_history吗?
kasperd

2
查看您的.profile和相关文件(对不起,不确定您使用的是哪个shell),然后暂时删除以查看是否有改善。您可能有一个正在超时的命令。
TheFiddlerWins 2015年

3
除了Moby Disk的建议之外,如果您从外壳程序内部启动外壳程序,它仍然同样慢吗?如果(重新)连接时速度很慢,但是从现有的已连接会话中启动第二个Shell时速度很快,那么这将告诉您不是由Shell本身引起的缓慢;如果在两种情况下同样慢,那么外壳在启动时所做的事情将花费大量时间。无论哪种方式,您都会了解“从零到shell提示”哪个方面比较慢。
CVn 2015年

2
通常,这是尝试进行的GSSAPI身份验证(如果您不是Kerberos商店,则可能完全无用)。其他时候,这是DNS反向查询。
Charles Duffy 2015年

Answers:


33

这里可能发生很多事情。您可以在shell手册中找到大多数答案,但是这些答案通常又长又斜,难以置信,所以...

您的问题很可能归结为以下几件事之一。

如果您的个人资料或bashrc中有昂贵的东西,请考虑将它们修剪掉。

如果您的配置文件或bashrc使用反向DNS查找(以设置提示或其他内容),请修复DNS或改用主机名。

外壳在初始化时会打开许多​​文件。如果系统负载很高,通常会在此处显示。

如果标语是预身份验证,则实际上它也可能是缓慢的身份验证(pam,LDAP等)。

不过,这些都不是。在显示提示之前,发生了很多事情!


1
我看到的另一个阻止了相当长时间的尝试GSSAPI身份验证(如果未在SSH客户端或服务器配置上关闭)。使用全面系统跟踪工具(例如sysdig)可能是解决此类相互关注问题的最有效方法。
查尔斯·达菲

+1彻底的答案。这个站点有一个很好的登录流程图,它们执行/源文件以及其他信息。
Tim S.

15
+1。99%的时间对我来说是反向DNS查找。
mpontillo

@Mike:在这里也一样-我建议从此开始,因为它很容易修复。在我的情况下是100%。
WoJ 2015年

22

它可能正在等待DNS或尝试通过LDAP等进行身份验证。

尝试添加UseDNS no到/ etc / ssh / sshd_config

如果它也在本地登录上执行此操作,请检查您配置的任何LDAP服务器或DNS服务器是否缓慢或无响应。


6

一种可能性(被其他答案覆盖)是,设置SSH会话本身的过程很浪费时间。

另一种选择是,在SSH会话建立之后,在远程计算机上运行的Shell启动脚本会花费很长时间(可能尝试访问某些中断的网络安装)。您可以如下调试第二种可能性:

暂时将以下内容添加到您的顶部~/.bash_profile

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

set -x一些调试的每个shell命令转执行。该PS4变量控制调试的方式-特别是在这种情况下,我们用于date添加时间戳。

然后,您可以分析调试输出的时间戳,以查看启动脚本中的哪些命令花费的时间太长。


1
当且仅当问题在打开远程会话之后发生时才为true。许多潜在的原因是在SSH握手和身份验证期间。
Charles Duffy 2015年

2
大大改善。:)
Charles Duffy 2015年

3

如果是Ubuntu服务器,则默认的登录设置会在每次登录Shell运行时检查是否有可更新的软件包。如果软件包列表不在磁盘缓存中,那么即使在快速空闲的桌面上也可能需要一两秒钟。

$ 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

为了生成“需要重新启动”消息,它必须检查当前正在运行的内核不是当前安装的默认内核。(即,有一个内核,但我还没有重启。)它还会打印一些可用的安全更新(如果有)。

我认为这是最近引入的登录Ubuntu的主要问题。

如果不是那样,则您的~/.bash_profile/ ~/.bashrc可能是问题。

您是否尝试过从本身(ssh localhost)登录到服务器?还是马上登录第二次?(以查看在缓存内容时它是否快得多。)


2

在大多数情况下,这是DNS请求的超时。

原因:服务器尝试使用客户端的IP地址进行反向DNS查找,但未得到答复。如果A连接到B,则B尝试将A的IP地址转换为名称。

解决方法:将客户端的IP地址和名称输入到服务器的主机文件中。

解决方案:使所有主机都为DNS服务器所知。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.