注:这开始是一个 “如何调试 "的教程,但最后是在Ubuntu 16.04 LTS服务器上帮助我的解决方案。
TLDR 。运行landscape-sysinfo
,检查该命令是否需要很长时间才能完成,这是新的SSH登录时的系统信息打印输出。注意,这个命令并不是在所有系统上都可用,landscape-common
包会安装它。("但是,等等,还有……”)
在出现问题的机器上的另一个端口上启动第二个ssh服务器,在调试模式下进行,这样不会使其分叉,并且会打印出调试信息。
sudo /usr/sbin/sshd -ddd -p 44321
在另一台机器上以verbose模式连接到那个服务器上:
ssh -vvv -p 44321 username@server
我的客户机在开始睡眠前输出了以下几行:
debug1: Entering interactive session.
debug1: pledge: network
Googling并没有什么帮助,但服务器的日志比较好。
debug3: mm_send_keystate: Finished sending state [preauth]
debug1: monitor_read_log: child log fd closed
debug1: PAM: establishing credentials
debug3: PAM: opening session
---- Pauses here ----
debug3: PAM: sshpam_store_conv called with 1 messages
User child is on pid 28051
我注意到当我把UsePAM yes
改为UsePAM no
时 这个问题就解决了。
与UseDNS
或其他设置无关,只有UsePAM
影响我系统的这个问题。
我不知道为什么,我也没有把UsePAM
留在no
,因为我不知道副作用是哪些,但这让我继续调查。
所以请不要认为这是一个答案,而是开始查找问题的第一步。
于是我继续调查,用sshd
运行strace
(sudo strace /usr/sbin/sshd -ddd -p 44321
)。这得到了以下结果。
sendto(4, "<87>Nov 20 20:35:21 sshd[2234]: "..., 110, MSG_NOSIGNAL, NULL, 0) = 110
close(5) = 0
stat("/etc/update-motd.d", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
umask(022) = 02
rt_sigaction(SIGINT, {SIG_IGN, [], SA_RESTORER, 0x7f15dce784b0}, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGQUIT, {SIG_IGN, [], SA_RESTORER, 0x7f15dce784b0}, {SIG_DFL, [], 0}, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
clone(child_stack=0, flags=CLONE_PARENT_SETTID|SIGCHLD, parent_tidptr=0x7ffde6152d2c) = 2385
wait4(2385, # BLOCKS RIGHT HERE, BEFORE THE REST IS PRINTED OUT # [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 2385
这一行/etc/update-motd.d
让我产生了怀疑,显然这个进程在等待/etc/update-motd.d
中的东西的结果,于是我cd
进入/etc/update-motd.d
,并运行了一个sudo chmod -x *
,以抑制PAM运行所有产生这个动态Message Of The Day
的文件,其中包括系统加载和是否需要升级包,这就解决了问题。
这是一台基于 “节能 "的N3150 CPU的服务器,它有很多工作要24小时不间断地进行,所以我认为收集所有这些motdata对它来说实在是太多了。
我可能会开始有选择地启用该文件夹中的脚本,看看哪些危害较小,但专门调用landscape-sysinfo
非常慢,而且50-landscape-sysinfo
确实会调用该命令。我想这是造成最大延迟的一个问题。
在重新启用大部分文件后,我得出的结论是50-landscape-sysinfo
和99-esm
是造成我麻烦的原因。50-landscape-sysinfo
的执行时间约为5秒,99-esm
约为3秒。其余的文件总共花了2秒左右。
50-landscape-sysinfo
和99-esm
都不是关键。50-landscape-sysinfo
可以打印出有趣的系统统计信息(也可以在你空间不足的时候打印!),99-esm
可以打印出与Ubuntu Extended Security Maintenance
相关的信息
最后你可以用echo '/usr/bin/landscape-sysinfo' > info.sh && chmod +x info.sh
创建一个脚本,并在请求时获得该打印结果。