返回博客列表

DNS解析慢会拖慢CDN吗?域名解析耗时怎么排查

CdnChart 技术团队发布于 2026-09-1717 分钟阅读
DNS解析慢会拖慢CDN吗?域名解析耗时怎么排查

网站已经接入CDN,节点延迟看起来也不高,可用户第一次打开时,浏览器还是会空等一会儿。刷新以后又快了。

这种情况,问题可能不在CDN传输,而在更靠前的一步:DNS解析。

DNS解析慢确实会拖慢网站和CDN的首次连接。浏览器必须先把域名解析成IP,才能与CDN节点建立TCP或QUIC连接,再进行TLS握手和HTTP请求。DNS没有返回结果,后面的加速能力还用不上。

但也要把边界说清楚:

  • DNS主要影响建立连接前的等待;

  • DNS已经缓存后,重复访问可能几乎看不到解析时间;

  • TTFB高、下载慢或页面渲染慢,不一定与DNS有关;

  • 换一个公共DNS后变快,不代表权威DNS一定有问题;

  • CDN使用DNS调度时,不同解析器还可能返回不同节点,不能只比较毫秒数。

先用一张表把问题拆开:

观察到的现象

DNS是不是重点怀疑对象

还需要看什么

首次打开慢,刷新后明显变快

DNS时间、连接复用、浏览器缓存

浏览器显示DNS阶段耗时很高

本地、递归、权威哪一层慢

DNS只用几毫秒,TTFB却很高

通常不是

CDN缓存、回源和源站处理

DNS很快,大文件下载慢

不是主要原因

带宽、丢包、限速和节点线路

只有某个地区或运营商解析慢

当地递归DNS、网络路径和节点调度

偶尔出现 SERVFAIL 或解析超时

是,而且优先级高

权威DNS、委派、DNSSEC和可达性

单个域名快,完整页面仍慢

不一定

页面是否引用大量第三方域名

DNS位于CDN访问链路的哪一步?

用户输入网址后,典型过程可以简化为:

输入域名
   ↓
浏览器、系统或递归DNS查找IP
   ↓
得到CDN入口地址
   ↓
建立TCP或QUIC连接
   ↓
完成TLS握手
   ↓
CDN缓存命中或向源站取内容
   ↓
返回网页和静态资源

DNS发生在连接CDN之前。

假设DNS阶段多等了800毫秒,即使CDN随后只用100毫秒返回内容,用户仍然已经在前面损失了800毫秒。

不过,浏览器、操作系统和递归解析器都会缓存DNS答案。同一个域名再次访问时,可能直接使用缓存,甚至复用已经建立的网络连接。

这就是为什么DNS问题经常表现为“第一次慢,刷新后正常”。

CDN不是已经有节点了吗,为什么还需要DNS?

CDN节点再多,用户也得先知道应该连接哪个IP。

许多CDN通过CNAME或权威DNS调度,根据用户所在地区、运营商、网络状况和服务配置返回合适的入口地址。例如:

www.example.com
        ↓ CNAME
www.example.com.cdn-provider.example
        ↓ A / AAAA
203.0.113.20

这个解析过程既负责“找到地址”,也可能参与“选择节点”。因此,DNS在CDN里不只是电话簿,还是流量调度链路的一部分。

如果DNS响应慢,连接开始得晚;如果返回了不合适的地址,DNS本身可能很快,后面的TCP、TLS和TTFB仍然会变慢。

所以测速时要同时记录:

  1. DNS用了多久;

  2. 返回了什么CNAME和IP;

  3. 不同地区和解析器拿到的答案是否不同;

  4. 最终连接的CDN节点是否符合预期。

可以先使用 CdnChart CDN检测 查看域名的CNAME、A/AAAA、响应IP、ASN及CDN厂商线索,再结合多地区测速判断调度结果。

先分清DNS里的三个缓存层

排查前,需要知道“DNS缓存”并不只在一个地方。

浏览器缓存

浏览器可能保存近期解析结果,也可能复用已经建立的连接。此时开发者工具里可能看不到新的DNS查询。

操作系统缓存

Windows、macOS、Linux或本地缓存服务可能保存DNS答案。

关闭网页标签页,并不一定会清掉系统缓存。

递归解析器缓存

家庭路由器、运营商DNS或公共DNS会代表用户向权威DNS查找结果,并按照TTL缓存答案。

即使清除了自己电脑的缓存,上游递归解析器仍可能直接返回已经缓存的结果。

这意味着:

一次很快的DNS查询,可能只是缓存命中;一次较慢的查询,可能是递归解析器恰好需要重新向权威链路查询。

两种结果都是真实的,但代表的访问场景不同。

第一步:在浏览器里确认DNS到底占了多少时间

打开Chrome开发者工具:

  1. F12 或右键选择“检查”;

  2. 打开Network面板;

  3. 重新加载页面;

  4. 选择主文档或某个请求;

  5. 打开Timing标签;

  6. 查看DNS Lookup、Initial connection、Waiting(TTFB)等阶段。

Chrome官方的Network Timing说明中,将DNS Lookup定义为浏览器解析请求IP地址的阶段;Initial connection包含TCP连接及SSL协商,Waiting(TTFB)则包含网络往返和服务器准备响应的时间。

因此:

  • DNS Lookup很高,而连接和TTFB正常:优先排查DNS;

  • DNS很低,TTFB却很高:重点检查缓存、回源和服务器;

  • DNS及TTFB正常,Content Download很高:重点检查带宽、文件大小和丢包。

需要注意,DNS显示为零不一定说明权威DNS速度极快。浏览器可能使用了缓存,或者直接复用了现有连接。无痕窗口也不保证绕开操作系统和递归DNS缓存。

完整页面还可能访问十几个甚至几十个主机名。主域名DNS很快,不代表广告、字体、统计、图片或API域名也快。

查看瀑布图时,应留意是否有某个第三方域名长期卡在DNS Lookup阶段。

第二步:用dig测试当前DNS解析时间

在Linux、macOS或安装了BIND工具的环境中,可以运行:

dig www.example.com A +stats

输出末尾通常会看到:

;; Query time: 26 msec
;; SERVER: 192.0.2.53#53(192.0.2.53)
;; WHEN: ...
;; MSG SIZE  rcvd: ...

重点记录:

  • status:是否为 NOERROR

  • ANSWER SECTION:返回的CNAME或IP;

  • Query time:这一次向指定递归DNS查询的耗时;

  • SERVER:实际使用了哪个DNS服务器;

  • TTL:该答案还能在缓存中保留多久。

第一次和第二次连续执行,结果可能不同:

dig www.example.com A +stats
dig www.example.com A +stats

如果第一次较慢、第二次明显变快,通常说明递归解析器第一次需要查找或刷新数据,之后命中了缓存。

这不一定是故障,但如果冷查询经常超时或耗时异常,就需要继续定位。

第三步:比较运营商DNS和公共DNS

先测试系统当前使用的解析器,再分别测试公共解析器:

dig www.example.com A +stats

dig @1.1.1.1 www.example.com A +stats

dig @8.8.8.8 www.example.com A +stats

不要只抄下三个 Query time,还要比较答案:

dig @1.1.1.1 www.example.com A +noall +answer
dig @8.8.8.8 www.example.com A +noall +answer

建议记录成下面这样:

查询位置

解析器

查询耗时

CNAME

A/AAAA结果

状态

上海电信

运营商默认DNS

18ms

示例CNAME

示例IP A

NOERROR

上海电信

1.1.1.1

32ms

示例CNAME

示例IP B

NOERROR

上海电信

8.8.8.8

41ms

示例CNAME

示例IP C

NOERROR

表中的内容只是格式示例,不代表任何解析器或CDN的真实性能。

为什么必须记录答案?因为CDN可能根据递归DNS位置或EDNS Client Subnet信息返回地域相关结果。

Google Public DNS的ECS说明指出,ECS可以让递归解析器向权威DNS提供客户端网段信息,从而获得针对客户端位置的响应。

这也意味着,换公共DNS后网站变快,可能有两种原因:

  1. 新解析器本身响应更快;

  2. 新解析器让CDN返回了不同的入口地址。

如果不记录解析IP和最终连接IP,就无法区分这两种情况。

公共DNS使用Anycast,同一个地址在不同地区可能对应不同服务节点。你在北京得到的结果,不能直接代表广州或海外用户。

第四步:检查CNAME链是不是过长

查看完整回答:

dig www.example.com A +noall +answer

可能看到:

www.example.com.                  300 IN CNAME site.cdn.example.
site.cdn.example.                 120 IN CNAME route.provider.example.
route.provider.example.           60 IN A     203.0.113.20

CNAME层级越多,递归解析器需要完成的工作通常越多,出错点也会增加。

但不能简单写成“每多一个CNAME就固定增加一次完整网络往返”。解析器可能已有缓存,也可能进行优化,实际影响要以冷缓存、多地区测试为准。

重点检查:

  • 是否存在不必要的多层CDN或流量调度域名;

  • 某个CNAME目标是否偶尔解析超时;

  • 不同链路的TTL是否差异很大;

  • 迁移CDN后是否仍保留旧别名;

  • 根域名的ALIAS或CNAME Flattening是否隐藏了外部链路。

如果检测工具只显示最终A记录,不代表中间没有发生别名解析。应同时检查权威配置和不同递归解析器的完整应答。

第五步:用+trace检查委派和权威DNS

当多个公共DNS都慢、偶尔 SERVFAIL,或者同一域名在部分地区无法解析时,可以继续执行:

dig +trace www.example.com A

ISC的BIND dig手册说明,+trace 会从根服务器开始进行迭代查询,并沿着委派逐步找到目标答案。

它可以帮助查看:

  • 根和顶级域是否正确委派;

  • 父区返回了哪些权威NS;

  • 权威服务器是否能从当前网络访问;

  • 问题卡在根、顶级域、权威NS还是后续CNAME目标;

  • 是否出现明显超时或不一致回答。

不过,dig +trace 不是普通用户日常解析过程的测速。

它绕过递归解析器缓存,从当前机器直接沿委派链查询,主要用于诊断,不应该把它的总耗时与浏览器DNS时间直接比较。

还可以先查询权威服务器:

dig example.com NS +short

然后直接询问其中一台权威NS:

dig @ns1.example.net www.example.com A +stats

应分别检查所有权威NS,而不是只测一台。

如果其中一台不可达或响应异常,用户是否遇到问题取决于递归解析器当时选择了哪台服务器,表现就可能是“多数时候正常,偶尔特别慢”。

第六步:用curl确认DNS慢了多少

dig 测的是DNS查询本身,curl 则能把DNS放回完整HTTP请求中观察:

curl -sS -o /dev/null \
  -w 'status=%{http_code}\nip=%{remote_ip}\ndns=%{time_namelookup}\nconnect=%{time_connect}\ntls=%{time_appconnect}\nttfb=%{time_starttransfer}\ntotal=%{time_total}\n' \
  https://www.example.com/

示例输出:

status=200
ip=203.0.113.20
dns=0.420817
connect=0.486503
tls=0.552481
ttfb=0.681209
total=0.742135

这些数字只是演示,不代表合理阈值或任何真实网站。

curl官方手册对time_namelookup的定义是:从请求开始到域名解析完成的累计时间。

其他时间同样是从请求开始累计,因此不能把 time_connect 直接当成纯TCP耗时。

可以粗略计算:

DNS时间      = time_namelookup
TCP阶段      = time_connect - time_namelookup
TLS阶段      = time_appconnect - time_connect
首字节前等待 = time_starttransfer - time_appconnect
下载阶段     = time_total - time_starttransfer

如果DNS占总时间的大部分,优先排查解析;如果DNS很低而TTFB很高,重点转向CDN缓存、节点处理、回源和源站。

使用 CdnChart网站测速 做多地区测试时,也应该把DNS时间与连接、TTFB和下载时间放在同一条请求链路里看,避免把所有耗时统一归为“CDN慢”。

第七步:A和AAAA要分开查

现代浏览器通常同时考虑IPv4和IPv6。

先分别查看记录:

dig www.example.com A +stats
dig www.example.com AAAA +stats

再分别测试HTTP连接:

curl -4 -sS -o /dev/null \
  -w 'ipv4_ip=%{remote_ip} dns=%{time_namelookup} connect=%{time_connect} total=%{time_total}\n' \
  https://www.example.com/

curl -6 -sS -o /dev/null \
  -w 'ipv6_ip=%{remote_ip} dns=%{time_namelookup} connect=%{time_connect} total=%{time_total}\n' \
  https://www.example.com/

如果AAAA解析很快,但IPv6连接不可达或质量很差,用户感受到的停顿可能发生在连接与回退阶段,而不是DNS服务器响应慢。

这类问题常被误判成“域名解析卡住”。判断时要看DNS和TCP阶段的分界,而不是只看浏览器整体等待时间。

DNS解析慢最常见的原因

1. 本地或运营商递归DNS响应慢

表现为同一地区使用默认DNS明显慢,而公共DNS相对正常。

原因可能是递归节点负载、网络路径、缓存未命中或上游查询不稳定。

需要从真实用户所在运营商复测,不能只在云服务器上更换解析器后下结论。

2. 权威DNS节点覆盖或可达性不好

如果多个递归解析器在缓存未命中时都要等待权威DNS,冷查询就会变慢。

某一台权威NS异常,还可能造成间歇性超时。

应检查所有权威NS是否分布合理、UDP和TCP 53端口是否可用、不同地区是否都能稳定响应。

3. CNAME链过长或上游目标不稳定

网站可能先经过流量调度平台,再进入CDN,之后又指向其他服务。

链路越复杂,越应该检查每一级目标、TTL和权威服务状态。

4. TTL过短导致缓存更容易失效

TTL决定DNS记录可以缓存多久。

较长TTL通常能提高缓存命中机会,却会让记录变更传播得更慢;较短TTL方便切换,但会增加递归解析器重新查询的频率。

Cloudflare的DNS TTL说明也强调了这个取舍:更长TTL有利于缓存查询,但记录更新需要更长时间才能触达用户。

不要为了“DNS更快”盲目把TTL调到极长,也不要认为把TTL设成几十秒就会让解析本身更快。

TTL控制的是缓存寿命,不是权威服务器单次响应速度。

5. DNSSEC配置错误

常见场景是更换DNS服务商后,注册商处仍保留旧DS记录,而新服务的DNSKEY无法匹配。支持验证的递归DNS可能返回 SERVFAIL

Cloudflare的DNSSEC排查文档建议使用带 +cd 的dig查询辅助确认:如果正常验证时返回 SERVFAIL,关闭验证检查后却能得到结果,DNSSEC配置值得重点检查。

示例:

dig @1.1.1.1 www.example.com A +dnssec
dig @1.1.1.1 www.example.com A +dnssec +cd

+cd 只适合诊断,不能作为绕开DNSSEC错误的长期解决方案。应修复注册商DS、DNSKEY和签名配置。

6. 域名委派、Glue或NS记录不一致

父区委派的NS与子区公开的NS不一致、Glue地址过期、权威服务器名称自身无法解析,都可能导致部分解析器失败或绕远。

Google Public DNS的域名排查指南将DNSSEC、权威服务器、委派问题和超大DNS响应列为逐步检查项目。

遇到跨地区 SERVFAIL 时,不应只反复清理本地缓存。

7. DNS响应过大或TCP回退异常

DNS通常优先使用UDP。

如果响应过大被截断,客户端或递归解析器需要切换到TCP。防火墙若只允许UDP 53、不允许TCP 53,就可能出现间歇失败。

DNSSEC和较大的TXT、DNSKEY响应尤其值得注意。

8. 浏览器使用了不同的DoH解析器

浏览器的安全DNS或DNS over HTTPS设置,可能让它使用的解析路径与系统命令不同。

因此,dig 正常而浏览器慢时,应确认浏览器是否启用了DoH、使用哪个提供商,以及企业网络是否对其进行了代理或拦截。

不同结果应该怎么判断?

测试结果

更可能的问题

下一步

本地DNS慢,1.1.1.1和8.8.8.8快

本地或运营商递归DNS

换网络复测,检查真实用户分布

所有递归DNS冷查询都慢

权威DNS、CNAME上游或委派链

测权威NS并运行 +trace

查询快,但返回的CDN入口很远

DNS调度或解析器地理信息

比较答案、ECS、响应IP和连接时间

A记录正常,AAAA异常

IPv6 DNS或权威配置

分别测A、AAAA和IPv4/IPv6连接

DNSSEC验证返回SERVFAIL,+cd正常

DNSSEC配置可能错误

核对DS、DNSKEY和签名

DNS很快,TCP/TLS很慢

网络路由或节点连接

检查运营商、丢包和CDN入口

DNS、连接都快,TTFB慢

CDN处理、回源或源站

查看缓存状态和源站日志

单域名测试正常,完整页面慢

多域名或第三方资源

查看浏览器瀑布图中的各主机名

首次慢,重复访问正常

DNS冷缓存、连接建立或CDN冷缓存

分别记录DNS、连接和缓存状态

偶尔解析超时或SERVFAIL

权威NS、网络、DNSSEC或委派不稳定

跨地区监控并保留错误输出

DNS解析应该怎么优化?

找到责任层以后再优化,不要一看到DNS耗时就立刻换服务商。

对网站运营者

  • 使用具有多地区覆盖和稳定SLA的权威DNS;

  • 确保至少两台权威NS都能通过UDP和TCP稳定响应;

  • 删除不必要的CNAME层级和历史调度记录;

  • 根据变更频率合理设置TTL;

  • 切换DNS服务商时同步检查注册商NS和DNSSEC DS记录;

  • 分别验证A、AAAA、CNAME、NS、SOA和DNSSEC;

  • 从目标用户地区和运营商持续监控解析成功率及P95;

  • 减少页面中不必要的第三方域名。

对访问用户或现场排查人员

  • 记录当前使用的DNS解析器,不要只说“网络正常”;

  • 比较运营商DNS与多个公共DNS;

  • 同时记录解析结果,防止换DNS后实际进入不同CDN节点;

  • 对比有线网络、Wi-Fi和移动网络;

  • 检查浏览器DoH设置与系统DNS是否一致;

  • 解析正常后继续检查TCP、TLS和TTFB,不要停在DNS这一层。

DNS测速最容易犯的错误

只测一次

第一次可能是冷查询,第二次可能命中缓存。只保留其中一次,都无法描述真实稳定性。

应至少连续测试多轮,并跨时间观察。

只比较Query time,不比较答案

CDN可能因解析器和用户位置返回不同节点。

一个DNS查询快10毫秒,却把用户送到更远的入口,最终网站不一定更快。

把刷新页面后的速度当成DNS优化结果

刷新会同时受到浏览器缓存、DNS缓存、TCP/TLS连接复用和CDN缓存影响,不能只归因于DNS。

用dig +trace代表普通用户体验

+trace 用于检查委派链和权威服务器,不会复现用户通过运营商递归DNS及缓存查询的完整场景。

清了本机缓存就认为所有缓存都清了

上游递归DNS可能仍保存答案或负缓存。本机刷新不会强制运营商解析器重新询问权威DNS。

看到AAAA就认为IPv6没有问题

记录存在不等于连接可用。需要分别使用 curl -4curl -6 验证网络阶段。

只看平均耗时,不看失败率和P95

DNS多数时候10毫秒、偶尔超时2秒,平均值可能仍不显眼,但用户会明显感受到卡顿。

稳定性排查应记录P50、P95、超时率和 SERVFAIL 比例。

常见问题

DNS解析慢一定会拖慢每一个网页请求吗?

不一定。

解析结果可能被浏览器、操作系统或递归DNS缓存,同一主机名下的连接也可能被复用。DNS慢通常更明显地影响首次访问、缓存失效后的查询和新出现的第三方域名。

DNS解析多少毫秒算慢?

没有脱离地区、网络和缓存状态的统一答案。

应区分冷查询与缓存命中,并与同地区其他域名和解析器建立基线。比一个固定阈值更重要的是P95、超时率和不同运营商之间的差距。

更换成1.1.1.1或8.8.8.8一定会更快吗?

不一定。

公共DNS在不同地区的网络路径不同,还可能影响CDN调度结果。应该同时比较查询时间、返回IP以及最终TCP、TLS和TTFB,不能只看DNS毫秒数。

CNAME越多,DNS一定越慢吗?

多层CNAME会增加解析工作和潜在故障点,但递归解析器可能已经缓存其中部分记录,因此影响不是固定线性增长。

需要通过冷查询和多地区数据判断。

TTL越低,DNS是不是越快?

不是。

低TTL意味着答案更快过期,递归解析器需要更频繁地重新查询权威DNS;它不会让权威服务器单次返回得更快。

浏览器显示DNS为0,说明没有DNS解析吗?

不一定。

浏览器可能使用缓存、已有连接或其他预解析机制。要观察冷解析,需要结合独立命令、不同解析器和多轮结果。

DNS很快,网站为什么还是慢?

解析只是第一步。

后面还有TCP、TLS、CDN处理、缓存、回源、内容下载、JavaScript执行和页面渲染。应继续查看TTFB、缓存状态和浏览器瀑布图。

DNS问题会不会只影响一个运营商?

会。

不同运营商使用不同递归DNS和网络路径,也可能从CDN权威DNS获得不同入口。需要在相同城市分别测试电信、联通和移动。

总结:DNS快不等于网站快,但DNS慢一定会让连接开始得更晚

排查DNS解析耗时,可以记住下面这条顺序:

  1. 用浏览器Timing确认慢请求是否真的卡在DNS Lookup;

  2. dig +stats 查看当前递归DNS的查询时间和答案;

  3. 对比运营商DNS、1.1.1.1和8.8.8.8,同时记录CNAME和IP;

  4. 检查CNAME层级、TTL、A和AAAA;

  5. dig +trace 和直接查询权威NS检查委派链;

  6. 遇到 SERVFAIL 时重点检查DNSSEC、NS和Glue配置;

  7. curl 把DNS、TCP、TLS、TTFB和总时间放在一起比较;

  8. 从真实用户所在地区和运营商持续观察P50、P95与失败率。

如果想先了解域名当前的解析链和CDN厂商线索,可以使用 CdnChart CDN检测;如果问题只在某些地区或运营商出现,再使用 CdnChart网站测速 对比多地区结果,并参考 CdnChart测评方法 理解P50与P95。

DNS解析慢会让CDN连接迟迟无法开始,但只要DNS阶段已经正常,就应该继续往后看。

把DNS、连接、首字节和下载拆开,才能避免把所有“网站慢”都归咎于CDN。

  • DNS解析慢
  • 域名解析耗时
  • DNS速度测试
  • 网站DNS耗时高