用数字描述解析快慢
「解析慢」这种描述无法定位问题,要用数字说话。dig 的输出里有一行 Query time,单位毫秒,表示从发出查询到收到应答的耗时。单次值只能算参考,真正有用的是采样分布:同一域名连续查询多次、或对多个 DNS 服务器分别采样,比较中位数与长尾。冷缓存与热缓存的差距很大,评估时必须把首次查询与后续命中缓存的查询分开看。
基本信息
| 适用平台 | dig(BIND 9 工具集) |
|---|---|
| 关键输出 | Query time: N msec(配合 +stats 或默认输出即可看到) |
| 取样要点 | 区分首次查询与缓存命中,避免混在一起统计 |
| 对比维度 | 不同 DNS 服务器、不同域名、不同时段 |
| 相关干扰 | UDP 丢包会触发超时重试,单次偏大的值可能是重试后的结果 |
典型使用场景
- 用户报「打开网站慢」:先量化是解析阶段慢还是连接阶段慢
- 评估多个 DNS 服务器:用同一域名分别采样,比较中位数与长尾
- 变更后回归:确认新 DNS 配置没有引入额外延迟
- 排查偶发卡顿:看是否存在少数耗时极高的样本
- 跨地域对比:从不同网络位置采样,确认解析服务是否就近
采样解析耗时
采样解析耗时
dig example.com | grep 'Query time' # 单次耗时
dig +stats example.com | grep -E 'Query time|SERVER'
# 连续采样并看最慢的几个
for i in $(seq 1 100); do dig +noall +stats example.com | awk '/Query time/{print $4}'; done | sort -n | tail -5
# 对比不同服务器的解析耗时
for s in 223.5.5.5 8.8.8.8 1.1.1.1; do echo -n "$s "; dig @$s +noall +stats example.com | awk '/Query time/{print $4"ms"}'; done
# 加大超时便于观察重试后的结果
dig +time=3 +tries=2 +stats example.com | grep 'Query time'采样结果判读
| 现象 | 含义 | 下一步 |
|---|---|---|
| 首次慢、后续快 | 第一次查询未命中缓存 | 属于正常递归开销,评估时应分开统计 |
| 每次都慢且稳定 | 到 DNS 的链路 RTT 高或服务器负载高 | 换就近服务器对比验证 |
| 多数快、少数极慢 | 存在重试或间歇性丢包 | 结合丢包统计与超时参数一起看 |
| 所有服务器都慢 | 本地网络或上游整体问题 | 检查本机到目标网络的链路质量 |
| 耗时接近超时值 | 该服务器实际未响应,靠重试才成功 | 用 +tries=1 复测确认真实响应情况 |
本机解析慢常见两种原因:到 DNS 服务器的网络 RTT 偏高,或服务器本身递归查询慢(首次未命中缓存)。用 IP 直连与域名解析的耗时对比可以快速区分。