这是一种常见的情况,在通过SSH连接到服务器(甚至在我的Mac上打开终端)后,登录横幅会立即打印出来,但需要大约10秒钟到一分钟的时间来显示shell提示。之后,性能会很好,网络延迟也很正常。
这似乎不像计算上的困难,占用大量内存或IO繁重的任务。这数十亿个CPU周期在做什么?
.bash_history
吗?
这是一种常见的情况,在通过SSH连接到服务器(甚至在我的Mac上打开终端)后,登录横幅会立即打印出来,但需要大约10秒钟到一分钟的时间来显示shell提示。之后,性能会很好,网络延迟也很正常。
这似乎不像计算上的困难,占用大量内存或IO繁重的任务。这数十亿个CPU周期在做什么?
.bash_history
吗?
Answers:
这里可能发生很多事情。您可以在shell手册中找到大多数答案,但是这些答案通常又长又斜,难以置信,所以...
您的问题很可能归结为以下几件事之一。
如果您的个人资料或bashrc中有昂贵的东西,请考虑将它们修剪掉。
如果您的配置文件或bashrc使用反向DNS查找(以设置提示或其他内容),请修复DNS或改用主机名。
外壳在初始化时会打开许多文件。如果系统负载很高,通常会在此处显示。
如果标语是预身份验证,则实际上它也可能是缓慢的身份验证(pam,LDAP等)。
不过,这些都不是。在显示提示之前,发生了很多事情!
一种可能性(被其他答案覆盖)是,设置SSH会话本身的过程很浪费时间。
另一种选择是,在SSH会话建立之后,在远程计算机上运行的Shell启动脚本会花费很长时间(可能尝试访问某些中断的网络安装)。您可以如下调试第二种可能性:
暂时将以下内容添加到您的顶部~/.bash_profile
:
set -x
PS4='+ $(date "+%s.%N")\011 '
在set -x
一些调试的每个shell命令转执行。该PS4
变量控制调试的方式-特别是在这种情况下,我们用于date
添加时间戳。
然后,您可以分析调试输出的时间戳,以查看启动脚本中的哪些命令花费的时间太长。
如果是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
)登录到服务器?还是马上登录第二次?(以查看在缓存内容时它是否快得多。)
ssh -v -v -v
并且ur_shell -x
可能是谨慎的调试步骤。