控制台运行缓慢通常会给人一种感觉:服务器负载很高,因此命令执行有很大延迟,但事实并非总是如此。
在执行基本命令(例如 top、ping、iostat)时,控制台响应缓慢还有其他原因。
为了确定延迟的准确原因,我们将使用 strace 命令。
1. 安装
apt install strace
2. 使用示例
2.1 显示全部
strace -r top -n 1
2.2 汇总结果
strace -r top -c 1
由于输出包含的信息过多,可以使用更紧凑的版本:
strace -r -e trace=connect,poll,openat,stat -o top_small.log top -n 1
3. 分析输出
0.000231 poll([{fd=3, events=POLLIN}], 1, 5000) = 0 (Timeout)
5.003045 poll([{fd=3, events=POLLOUT}], 1, 0) = 1 ([{fd=3, revents=POLLOUT}])
系统调用 poll 的超时时间为 5000 毫秒,未收到 DNS 服务器(8.8.8.8)的响应。这正好花费了 5 秒。
5.005113 poll([{fd=3, events=POLLOUT}], 1, 0) = 1 ([{fd=3, revents=POLLOUT}])
紧接着第一次之后,top 再次尝试发出请求,使用同一个 DNS 服务器,并再次等待 5 秒。
4. 结论
命令执行延迟 10 秒,与服务器负载无关,而是因为长时间等待 /etc/resolv.conf 中指定的 DNS 服务器的响应。
如果您使用的是 Google 的全球 DNS,它在某些国家可能被屏蔽,就像我们遇到的情况一样。只需将其更换为您所在国家的 DNS 即可。
No Comments Yet

