dig命令比ping更准测DNS延迟,因其走UDP 53端口而非ICMP;执行dig @DNS_IP 域名 +short +stats可得真实查询耗时(Query time),单位毫秒,不受本地缓存干扰。

直接用 dig 命令加 @指定DNS服务器 测试,比 ping 更准——因为 DNS 查询走 UDP 53 端口,不是 ICMP,ping 的延迟不能代表真实解析耗时。
用 dig 测单个 DNS 服务器响应时间
执行命令即可获取权威响应时间(单位毫秒):
dig @8.8.8.8 www.baidu.com +short +stats关键看最后一行类似:
;; Query time: 12 msec
这个 Query time 是从发包到收到完整响应的真实耗时,不受本地缓存干扰(+short 减少输出,+stats 强制显示统计)。
- 替换 @8.8.8.8 为你想测的 DNS,比如:@114.114.114.114(中国电信)、@223.5.5.5(阿里云)、@1.1.1.1(Cloudflare)
- 建议固定查同一个域名(如 www.baidu.com 或 example.com),避免 CDN 返回不同 IP 影响可比性
- 加 +noall +stats 可只显示统计行,更干净:dig @223.5.5.5 example.com +noall +stats
批量对比多家运营商 DNS 延迟
一次性跑多个,快速横向比较:
for dns in "8.8.8.8" "114.114.114.114" "223.5.5.5" "1.1.1.1"; do echo -n "$dns: "; dig @$dns example.com +short +stats 2>/dev/null | grep "Query time"; done输出类似:
114.114.114.114: ;; Query time: 8 msec
223.5.5.5: ;; Query time: 6 msec
1.1.1.1: ;; Query time: 15 msec
- 结果中数值越小,说明该 DNS 在你当前网络环境下响应越快
- 若某 DNS 长期超时或返回空,可能是被防火墙拦截、UDP 53 被限速,或该服务器对你所在地区路由不佳
- 不要只测一次,可配合 watch -n 2 每2秒刷新观察波动:watch -n 2 'dig @223.5.5.5 example.com +noall +stats'
排除本地干扰,确保测的是真实 DNS 延迟
很多“慢”其实不是 DNS 服务器问题,而是本地环节拖累:
- 先确认没走 hosts 或 systemd-resolved 缓存:加 +norecurse 可绕过本地递归器,直连目标 DNS(但需该 DNS 支持迭代查询)
- 检查 /etc/resolv.conf 是否被 NetworkManager 或 systemd-resolved 动态覆盖;临时改用干净环境测试:sudo systemd-resolve --flush-caches && sudo resolvectl flush-caches
- 用 tcpdump -i any port 53 抓包验证是否真发到了目标 DNS,有没有被重定向或丢弃
- 如果所有公共 DNS 都慢,重点查本机到出口网关的 UDP 53 是否被 QoS 限速或运营商劫持
补充:nslookup 也能测,但不如 dig 直观
nslookup 支持交互式切换 server,适合快速试几个:
nslookup> server 114.114.114.114
Default server: 114.114.114.114
Address: 114.114.114.114#53
> www.baidu.com
但它不默认显示耗时,需加 set debug 才能看到时间戳,且输出冗长。日常推荐优先用 dig。


















