我每次打开新浏览器选项卡或执行 curl 请求时都会出现 5-10 秒的延迟。我在互联网上发现我应该禁用 IPv6。但当我禁用 IPv6 时,Chrome 选项卡立即开始加载,但连接到互联网的终端命令仍然会受到这种延迟的影响。
我正在使用 Manjaro Linux 23.0.2
以下是我可以向您展示的最小的示例:
卷曲
$ time curl google.com
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>
curl google.com 0,00s user 0,01s system 0% cpu 5,283 total
ping(5秒后打印第一行)
$ time ping -c 5 google.com
PING google.com (142.250.184.142) 56(84) bytes of data.
64 bytes from sof02s43-in-f14.1e100.net (142.250.184.142): icmp_seq=1 ttl=55 time=9.70 ms
64 bytes from sof02s43-in-f14.1e100.net (142.250.184.142): icmp_seq=2 ttl=55 time=12.3 ms
64 bytes from sof02s43-in-f14.1e100.net (142.250.184.142): icmp_seq=3 ttl=55 time=14.4 ms
64 bytes from sof02s43-in-f14.1e100.net (142.250.184.142): icmp_seq=4 ttl=55 time=9.86 ms
64 bytes from sof02s43-in-f14.1e100.net (142.250.184.142): icmp_seq=5 ttl=55 time=11.2 ms
--- google.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4006ms
rtt min/avg/max/mdev = 9.696/11.495/14.419/1.746 ms
ping -c 5 google.com 0,01s user 0,00s system 0% cpu 9,043 total
但是这个命令非常快:
$ time nslookup google.com
Server: 1.1.1.1
Address: 1.1.1.1#53
Non-authoritative answer:
Name: google.com
Address: 142.250.184.142
Name: google.com
Address: 2a00:1450:4017:814::200e
nslookup google.com 0,01s user 0,03s system 22% cpu 0,147 total
我尝试过的事情:
- 将我的 DNS 服务器更改为 cloudflare 和 google(在 Wi-Fi 设置中)
- 已禁用 ipv6
问题是我该如何诊断问题?如果可能的话,我该如何解决?
答案1
问题是我该如何诊断这个问题?
首先我建议你取消禁用所有你尝试禁用的功能。在系统处于正常状态时诊断问题。
由于这看起来像是网络连接超时(可能是 DNS 查询超时),请打开数据包捕获工具(首先是 Wireshark),并在尝试时观察数据包捕获。查找似乎没有回复的传出请求,例如 LLMNR 或 mDNS 或 NBNS 查询,或发送到错误服务器的 DNS 查询。关闭浏览器和curl
其他ping
可能在捕获中产生大量噪音的程序。
该nslookup
工具的工作方式与curl
或不同ping
——它专门是一个 DNS 查询工具,将直接与您配置的 DNS 服务器之一对话,而其他程序不这样做;他们使用系统提供的“主机名查找”功能,该功能比 DNS 功能更多。Linux 版本有各种可以通过启用的模块/etc/nsswitch.conf
- 除了“文件”(/etc/hosts)和“dns”(/etc/resolv.conf)之外,您可能还有“resolve”(充当本地 DNS 缓存的 systemd-resolved 服务)或“mdns”(本地子网名称查找)之类的东西。您应该查看 nsswitch.conf 文件并尝试使用它getent hosts
进行查询。
getent hosts google.com
getent -s dns hosts google.com
getent hosts 1.1.1.1
getent -s dns hosts 1.1.1.1
从 ping 的行为来看,它可能是前向查询或者反向“IP→域名”查询需要一段时间;分别测试两者。
使用更简单的工具(例如ping
),运行下面的工具strace
可能会揭示它在等待什么;例如,如果它似乎暂停在recv(5, ..)
您向上滚动直到找到connect(5, <address>)
。