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

jac*_*aer 31 performance ssh shell

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

这似乎不是一项计算困难、内存密集或 IO 密集型的任务。所有这些数十亿个 CPU 周期都在做什么?

Fal*_*mot 33

这里可能会发生很多事情。您可以在 shell 手册中找到大部分答案,但这些答案通常非常长且倾斜,因此...

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

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

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

Shell 在初始化时会打开许多​​文件等。如果系统负载很高,经常会出现在这里。

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

不过,这可能都不是。在显示提示之前发生了惊人数量的事情!

  • +1。对我来说,99% 的时间是反向 DNS 查找。 (15认同)

sCi*_*hre 22

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

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

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


Dig*_*uma 6

一种可能性(由其他答案覆盖)是设置 SSH 会话本身的过程是时间丢失的地方。

另一种选择是,在建立 SSH 会话后,在远程计算机上运行的 shell 启动脚本有一些需要很长时间的东西(可能试图访问一些损坏的网络安装)。您可以按如下方式调试第二种可能性:

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

set -x
PS4='+ $(date "+%s.%N")\011 '
Run Code Online (Sandbox Code Playgroud)

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

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

  • 大有改善。:) (2认同)