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、网络路径和节点调度 |
偶尔出现 | 是,而且优先级高 | 权威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仍然会变慢。
所以测速时要同时记录:
DNS用了多久;
返回了什么CNAME和IP;
不同地区和解析器拿到的答案是否不同;
最终连接的CDN节点是否符合预期。
可以先使用 CdnChart CDN检测 查看域名的CNAME、A/AAAA、响应IP、ASN及CDN厂商线索,再结合多地区测速判断调度结果。
先分清DNS里的三个缓存层
排查前,需要知道“DNS缓存”并不只在一个地方。
浏览器缓存
浏览器可能保存近期解析结果,也可能复用已经建立的连接。此时开发者工具里可能看不到新的DNS查询。
操作系统缓存
Windows、macOS、Linux或本地缓存服务可能保存DNS答案。
关闭网页标签页,并不一定会清掉系统缓存。
递归解析器缓存
家庭路由器、运营商DNS或公共DNS会代表用户向权威DNS查找结果,并按照TTL缓存答案。
即使清除了自己电脑的缓存,上游递归解析器仍可能直接返回已经缓存的结果。
这意味着:
一次很快的DNS查询,可能只是缓存命中;一次较慢的查询,可能是递归解析器恰好需要重新向权威链路查询。
两种结果都是真实的,但代表的访问场景不同。
第一步:在浏览器里确认DNS到底占了多少时间
打开Chrome开发者工具:
按
F12或右键选择“检查”;打开Network面板;
重新加载页面;
选择主文档或某个请求;
打开Timing标签;
查看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后网站变快,可能有两种原因:
新解析器本身响应更快;
新解析器让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.20CNAME层级越多,递归解析器需要完成的工作通常越多,出错点也会增加。
但不能简单写成“每多一个CNAME就固定增加一次完整网络往返”。解析器可能已有缓存,也可能进行优化,实际影响要以冷缓存、多地区测试为准。
重点检查:
是否存在不必要的多层CDN或流量调度域名;
某个CNAME目标是否偶尔解析超时;
不同链路的TTL是否差异很大;
迁移CDN后是否仍保留旧别名;
根域名的ALIAS或CNAME Flattening是否隐藏了外部链路。
如果检测工具只显示最终A记录,不代表中间没有发生别名解析。应同时检查权威配置和不同递归解析器的完整应答。
第五步:用+trace检查委派和权威DNS
当多个公共DNS都慢、偶尔 SERVFAIL,或者同一域名在部分地区无法解析时,可以继续执行:
dig +trace www.example.com AISC的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并运行 |
查询快,但返回的CDN入口很远 | DNS调度或解析器地理信息 | 比较答案、ECS、响应IP和连接时间 |
A记录正常,AAAA异常 | IPv6 DNS或权威配置 | 分别测A、AAAA和IPv4/IPv6连接 |
DNSSEC验证返回SERVFAIL, | 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 -4 和 curl -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解析耗时,可以记住下面这条顺序:
用浏览器Timing确认慢请求是否真的卡在DNS Lookup;
用
dig +stats查看当前递归DNS的查询时间和答案;对比运营商DNS、1.1.1.1和8.8.8.8,同时记录CNAME和IP;
检查CNAME层级、TTL、A和AAAA;
用
dig +trace和直接查询权威NS检查委派链;遇到
SERVFAIL时重点检查DNSSEC、NS和Glue配置;用
curl把DNS、TCP、TLS、TTFB和总时间放在一起比较;从真实用户所在地区和运营商持续观察P50、P95与失败率。
如果想先了解域名当前的解析链和CDN厂商线索,可以使用 CdnChart CDN检测;如果问题只在某些地区或运营商出现,再使用 CdnChart网站测速 对比多地区结果,并参考 CdnChart测评方法 理解P50与P95。
DNS解析慢会让CDN连接迟迟无法开始,但只要DNS阶段已经正常,就应该继续往后看。
把DNS、连接、首字节和下载拆开,才能避免把所有“网站慢”都归咎于CDN。
- DNS解析慢
- 域名解析耗时
- DNS速度测试
- 网站DNS耗时高