网站有时快有时慢,CDN测速应该怎么测?
上午打开只用了半秒,下午同一个页面却转了三四秒;自己办公室访问很快,客户换一条运营商线路就说卡;测速工具第一次显示正常,刷新一次,结果又差了一大截。
网站明明接入了CDN,为什么速度还是忽快忽慢?
先别急着换CDN。当问题本身是“有时快、有时慢”时,一次测速几乎没有结论价值。
正确做法是固定测试对象和条件,从多个地区、运营商、时间段重复采样,并把首次访问与缓存访问分开。结果不能只看平均值,还要同时看P50、P95、成功率、响应节点和缓存状态。
一套能用于排查的CDN测速,至少要回答下面五个问题:
要回答的问题 | 需要记录的数据 |
|---|---|
哪些用户慢 | 地区、运营商、IPv4/IPv6、测试节点 |
慢在哪个阶段 | DNS、TCP、TLS、TTFB、内容下载时间 |
是一直慢还是偶尔慢 | 多轮结果、P50、P95、最大值、失败率 |
是CDN慢还是源站慢 | 缓存HIT/MISS、Age、回源日志、源站耗时 |
是单个资源还是整个页面慢 | HTML、静态小文件、大文件、页面瀑布图 |
如果只记录一句“网站打开用了2秒”,上面五个问题一个也回答不了。
为什么同一个网站的测速结果会变化?
一次网站访问,并不是用户直接从CDN“拿到一个速度数字”。它中间要经过域名解析、节点调度、网络连接、TLS握手、CDN缓存查询、可能的回源,以及内容传输和浏览器渲染。
其中任何一段发生变化,最终时间都会变化。
1. 每次可能进入不同的CDN节点
CDN会根据DNS、Anycast路由、运营商网络、节点健康状态和调度策略,把用户导向不同节点。
即使是同一个城市,两次请求也不一定连接相同的IP;IPv4和IPv6还可能进入不同网络。一个节点线路通畅,另一个节点当时拥塞,用户感受到的速度自然不同。
因此,测速时必须记录响应IP或节点标识。否则你只知道“这次慢了”,却不知道慢请求是否集中在某个节点。
2. 一次缓存命中,一次发生回源
同一个URL在CDN节点已有缓存时,可能直接返回;缓存不存在、过期或被绕过时,CDN还要向上游或源站取内容。
于是你可能看到:
# 第一次请求
CF-Cache-Status: MISS
# 再次请求
CF-Cache-Status: HIT
Age: 12第二次更快并不奇怪。反过来,如果每次测速都添加随机查询参数,也可能不停制造新的缓存键,让每次结果都像首次访问。
所以必须把“冷缓存测试”和“热缓存测试”分开,不能混在同一组数据里求平均值。
3. 源站和应用负载在变化
如果HTML、API或缓存未命中的资源需要回源,源站CPU、数据库、磁盘、连接池、第三方接口和跨区域回源线路都会影响TTFB。
白天访问正常,业务高峰变慢;静态文件很快,首页HTML很慢;CDN显示 MISS 时慢,HIT 时正常——这些现象更像源站或回源链路问题,而不是简单的“CDN节点不行”。
4. 用户网络本身在变化
Wi-Fi信号、移动网络切换、运营商出口拥塞、跨网互联、丢包和路由变化,都会让相同网站在不同时刻表现不同。
只在公司宽带或自己的云服务器上测试,最多能代表这一个位置,不能代表目标用户。
5. 浏览器缓存和连接复用影响了结果
第二次刷新时,浏览器可能直接使用本地缓存,也可能复用已经建立的TCP、TLS或HTTP/2连接。此时DNS查询、握手和部分资源下载都会减少。
因此,“第一次打开”和“刷新后打开”测的不是完全相同的场景。前者更接近新访客,后者更接近连续浏览用户。
6. 页面里的第三方资源不稳定
页面主HTML和本站静态资源可能都很快,但广告、统计脚本、客服组件、字体、地图或外部API卡住了,浏览器里的整体加载时间仍会变慢。
这也是为什么CDN单文件测速和完整网页测速不能互相替代:前者更适合检查网络与内容分发,后者才会暴露资源依赖、JavaScript执行和渲染问题。
CDN测速到底应该测哪些指标?
不要只盯着一个“总耗时”。把总时间拆开,才知道应该找谁解决。
指标 | 表示什么 | 明显波动时优先检查 |
|---|---|---|
DNS时间 | 域名解析到IP所需时间 | DNS服务、递归解析器、CNAME链、缓存 |
TCP连接时间 | 与响应节点建立网络连接的时间 | 网络路由、丢包、节点距离、跨网质量 |
TLS时间 | HTTPS握手所需时间 | 网络往返、TLS配置、证书链、连接复用 |
TTFB | 发出请求后,到收到第一个响应字节的时间 | 网络延迟、CDN处理、缓存、回源、应用 |
内容下载时间 | 从首字节到完整接收响应的时间 | 文件大小、带宽、拥塞、丢包、限速 |
总时间 | 从请求开始到内容下载完成 | 上述阶段的综合结果 |
HTTP状态码 | 请求最终是否成功 | 4xx、5xx、超时、重定向和拦截 |
缓存状态 | 请求是HIT、MISS、BYPASS还是其他状态 | 缓存规则、缓存键、TTL、回源 |
响应IP/节点 | 本次请求实际进入哪个网络入口 | 节点调度、运营商和地区差异 |
Chrome DevTools的网络请求时间说明把单个请求拆分为DNS Lookup、Initial connection、Waiting(TTFB)和Content Download等阶段。
其中TTFB包含一次网络往返,以及服务器准备响应所花的时间。因此,TTFB高并不能自动证明“源站计算慢”,网络距离、CDN边缘处理和回源路径也可能包含在内。
第一步:先固定测试对象,不要什么都混着测
建议至少准备三类URL。
1. 主页面HTML
例如:
https://www.example.com/它能反映页面入口、重定向、HTML缓存和源站响应情况,但容易受到登录状态、个性化内容和应用逻辑影响。
2. 小型静态文件
例如一个几十KB的CSS、JavaScript或Logo:
https://www.example.com/assets/app.css小文件的总耗时主要受DNS、连接、TLS和TTFB影响,适合观察节点延迟和缓存是否稳定。
3. 固定大小的大文件
例如一个1MB、5MB或10MB的公开测试文件:
https://static.example.com/test/5mb.bin大文件更适合观察持续下载速度和吞吐量。文件太小,可能还没进入稳定传输阶段就下载完了;文件每次大小不同,又无法公平比较。
测试文件必须是公开、无敏感信息、内容固定并允许缓存的对象。不要拿用户文件、带签名的私有URL或后台接口做公开测速。
第二步:把首次访问和重复访问分开
如果想知道普通用户的实际体验,至少保留两组结果。
首次访问组
模拟一个此前没有访问过该页面的用户:
浏览器本地没有缓存;
没有可复用连接;
CDN边缘缓存也可能是冷的;
可能需要完整DNS、TCP和TLS过程。
首次访问更容易暴露冷缓存、回源和连接建立成本。
重复访问组
在相同节点、相同URL和相近时间再次请求:
CDN缓存可能已经填充;
浏览器可能使用本地缓存;
网络连接可能被复用。
如果首次访问慢、重复访问稳定变快,重点检查缓存状态、TTL和首次回源过程。如果首次与重复访问都慢,则需要继续看网络路径、CDN节点、源站和文件传输。
需要注意,浏览器本地缓存和CDN缓存不是一回事。
为了单独观察CDN,可以使用命令行发起普通GET请求,并丢弃响应正文,而不是依赖浏览器刷新结果。
第三步:用curl拆分一次请求的时间
下面这条命令可以快速查看一个URL的主要阶段时间:
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}\nsize=%{size_download}\nspeed=%{speed_download}\n' \
https://www.example.com/assets/app.css输出示例:
status=200
ip=203.0.113.20
dns=0.018532
connect=0.051437
tls=0.102219
ttfb=0.168604
total=0.221740
size=86324
speed=389302这里的时间单位是秒。
需要特别注意:time_connect、time_appconnect 和 time_starttransfer 都是从请求开始累计的时间,不是彼此独立的阶段耗时。
可以粗略这样理解:
DNS阶段 = time_namelookup
TCP阶段 = time_connect - time_namelookup
TLS阶段 = time_appconnect - time_connect
首字节前等待 = time_starttransfer - time_appconnect
内容下载阶段 = time_total - time_starttransfer如果发生重定向、连接复用、代理转发或非HTTPS请求,部分字段会有所不同。这个拆分适合快速定位,不应替代浏览器瀑布图、CDN日志和链路监控。
连续测试十次
for i in $(seq 1 10); do
printf 'request=%s ' "$i"
curl -sS -o /dev/null \
-w 'status=%{http_code} ip=%{remote_ip} dns=%{time_namelookup} connect=%{time_connect} tls=%{time_appconnect} ttfb=%{time_starttransfer} total=%{time_total}\n' \
https://www.example.com/assets/app.css
sleep 2
done如果还要观察缓存状态,可以另外查看响应头:
curl -sS -D - -o /dev/null https://www.example.com/assets/app.css \
| grep -Ei '^(age|cache-control|cdn-cache-control|cf-cache-status|x-cache|via|server):'不要为了“避免缓存”而默认给每次请求追加随机参数。那会改变缓存键,测出来的可能始终是冷请求。
只有在专门测试回源或冷缓存时,才应使用可控的不同URL,并将其结果单独分组。
第四步:多地区、多运营商分别测
本地电脑连续测十次,只能回答“你这里怎么样”。CDN是否稳定,需要从目标用户所在网络观察。
如果用户主要在中国大陆,至少应覆盖:
电信;
联通;
移动;
业务用户集中的省份;
IPv4和IPv6,如果网站同时支持。
如果是出海业务,应按真实用户分布选择地区,例如:
中国香港、新加坡、日本;
美国东部和西部;
德国、英国等欧洲主要区域;
印度、巴西或中东等实际业务市场。
可以使用 CdnChart网站测速 从不同地区观察同一网站的访问结果。
测试时不要只截图一个“最快节点”或“最慢节点”,要记录每个节点的地区、运营商、响应IP、状态码和各项耗时。
如果不同地区解析到了不同厂商或网络,可以进一步使用 CdnChart CDN检测 查看CNAME、IP/ASN和响应头线索,避免把多CDN调度或厂商迁移误认为单一节点波动。
第五步:同一节点至少测几次?
没有一个适合所有场景的固定次数,但可以按问题严重程度安排。
目的 | 建议采样方式 | 能回答什么 |
|---|---|---|
快速检查 | 每个节点连续5次 | 是否存在明显冷缓存或偶发超时 |
配置验证 | 每个节点10次,区分首次与重复访问 | CDN接入或规则修改是否生效 |
波动排查 | 每15~30分钟一次,持续24小时 | 是否与时间段、节点或源站负载有关 |
高峰问题 | 高峰前、中、后分别多轮测试 | 是否只在业务高峰恶化 |
长期监控 | 固定频率记录,并设置分位数与失败率告警 | 性能趋势和回归变化 |
测速频率不是越高越好。
对生产网站做高频、大文件测试会产生带宽和请求成本,也可能触发防护规则。测试自己的网站时,应根据文件大小、费用和安全策略控制频率;测试第三方网站时,更不能进行高并发压力测试。
不要只看平均值,要看P50、P95和失败率
假设某个节点测了20次,其中18次在200毫秒左右,2次超过3秒。平均值可能看起来还能接受,但那两个慢请求正是用户抱怨“偶尔卡一下”的来源。
因此至少应记录:
指标 | 怎么理解 | 适合回答什么问题 |
|---|---|---|
P50 | 中位数,一半结果不高于这个值 | 大多数时候通常有多快 |
P95 | 约95%的结果不高于这个值,剩余约5%更慢 | 较差体验到底有多差 |
最大值 | 样本中最慢的一次 | 是否出现极端尖峰,不能单独代表整体 |
成功率 | 成功请求数占总请求数的比例 | 是否存在超时、5xx或连接失败 |
波动范围 | 快慢结果之间的差距 | 性能是否稳定 |
下面是一组演示数据,不代表任何真实网站:
测试节点 | P50 TTFB | P95 TTFB | 成功率 | 初步判断 |
|---|---|---|---|---|
上海电信 | 120ms | 180ms | 100% | 快且稳定 |
广州移动 | 145ms | 980ms | 100% | 日常不慢,但存在长尾抖动 |
新加坡 | 210ms | 260ms | 100% | 延迟稍高但稳定 |
法兰克福 | 240ms | 1,850ms | 96% | 需要检查节点、路由或回源异常 |
如果只看四个节点的平均值,广州移动和法兰克福的问题很容易被掩盖。
CdnChart测评方法使用P50、P95等分位数观察典型表现和尾部体验。对于“网站偶尔慢”的问题,P95通常比单次最好成绩更有诊断价值。
一套可以直接照着执行的测速方案
如果现在有人反馈网站忽快忽慢,可以按下面流程测。
第一轮:十分钟快速复现
固定一个页面HTML、一个静态小文件和一个固定大文件;
从本地分别连续请求5~10次;
记录状态码、响应IP、DNS、TCP、TLS、TTFB和总时间;
查看静态文件的HIT、MISS和Age;
判断慢请求是否集中在首次访问、缓存MISS或某个响应IP。
第二轮:多地区交叉验证
选择与真实用户相符的地区和运营商;
所有节点测试完全相同的URL;
每个节点执行多轮,而不是只测一次;
区分IPv4和IPv6;
汇总每个节点的P50、P95和成功率。
第三轮:跨时间观察
如果前两轮没有稳定复现,就把测试延长到24小时:
上午业务低谷;
中午;
晚间访问高峰;
用户集中投诉的时间段;
发布、清缓存或流量切换前后。
每次保持测试条件一致,并记录应用发布、缓存清除、DNS修改和CDN规则变更。
没有变更时间线,第二天看到一条慢数据时,很难知道它与什么事件有关。
第四轮:用日志确认责任层
客户端测速只能观察请求链路的结果。要确认问题发生在哪一层,还需要对照:
CDN访问日志;
缓存命中与回源指标;
源站访问日志;
应用和数据库监控;
5xx、超时及连接错误;
节点、地区和运营商维度。
Google Cloud CDN的缓存日志与监控说明展示了如何从日志区分缓存命中、验证和未命中,并通过地区流量、缓存命中率、错误率以及P95 TCP往返延迟等指标持续观察CDN状态。
真正的稳定性判断应该来自一段时间的监控,而不是一次手动刷新。
看结果时,怎样定位到底慢在哪里?
可以先用下面这张表做初步判断。
现象 | 更可能的方向 | 需要继续确认 |
|---|---|---|
DNS时间偶尔很高 | DNS解析器、CNAME链、缓存或网络 | 换解析器、地区和运营商对比 |
TCP/TLS时间高 | 节点距离、路由、丢包或握手 | 响应IP、节点地区、IPv4/IPv6 |
TTFB高且缓存MISS | 回源网络、源站或应用处理 | 源站日志、回源耗时、数据库负载 |
TTFB高但缓存HIT | CDN边缘处理、节点负载、网络往返或边缘函数 | 节点标识、路由、厂商日志 |
TTFB正常但下载慢 | 带宽、拥塞、丢包、限速或文件过大 | 大文件吞吐、运营商和节点差异 |
单文件快但完整页面慢 | 第三方资源、请求依赖、JS执行或渲染 | 浏览器瀑布图、LCP和主线程任务 |
只有首次访问慢 | 冷缓存、回源、DNS/TLS建立 | 首次/重复结果和缓存状态 |
只有某一运营商慢 | 互联路由或该线路节点覆盖 | 同地区跨运营商对比 |
所有地区同一时段变慢 | 源站负载、发布、缓存清除或全局配置 | 变更记录、源站与CDN监控 |
P50正常但P95很高 | 少数请求长尾抖动 | 慢样本的节点、状态码和缓存状态 |
这张表只能用于缩小范围。
比如“TTFB高且MISS”更值得怀疑回源,但并不能在没有日志的情况下直接认定源站有问题。
为什么测速工具和真实用户反馈不一样?
测速工具通常属于受控的合成测试:在指定设备、网络或节点下主动访问页面,适合复现问题和比较修改前后的差异。
真实用户数据则来自不同设备、网络、地区和使用环境,更适合判断一段时间内用户实际经历了什么。
Google在PageSpeed Insights说明中明确区分了实验室数据和真实用户数据:
实验室数据适合在受控环境里调试,但可能无法覆盖真实世界的瓶颈;
真实用户数据能反映实际体验,却提供较少的诊断细节;
PageSpeed Insights中的CrUX真实用户数据代表过去28天的样本;
一次Lighthouse测试只代表特定模拟环境下的一次加载。
所以,当用户说网站慢、工具却显示很快时,不要简单认为用户网络差,也不要立刻否定测速结果。
更合理的做法是:
用多地区合成测试复现;
用真实用户监控确认影响范围;
再用CDN、源站和应用日志定位原因。
三类证据各自回答不同问题,不能互相替代。
CDN测速最容易犯的八个错误
1. 只测一次
一次结果可能正好遇到冷缓存、网络抖动或连接复用,既不能代表日常速度,也不能说明稳定性。
2. 只看平均值
平均值会掩盖少数极慢请求。“有时慢”本身就是尾部问题,应该重点看P95、最大值和失败率。
3. 只在自己电脑上测
自己快不等于客户快。CDN的价值本来就与地区和运营商有关,单一位置无法代表全国或全球。
4. 每次使用不同URL
随机参数、不同协议、不同主机名和不同文件版本都会改变请求路径或缓存键,最终比较的不是同一个对象。
5. 把浏览器缓存当成CDN缓存
刷新后变快,可能只是浏览器本地已经有文件,不能据此证明CDN边缘缓存命中。
6. 用小文件判断下载带宽
小文件适合看响应延迟,不适合准确判断持续吞吐。测试下载能力应使用固定大小、足够大的公开文件。
7. 只看ping值
Ping测试的是ICMP往返,不能完整反映DNS、TLS、HTTP处理、缓存、回源和内容下载。有些节点还会限制或不响应ICMP。
8. 不记录状态码和缓存结果
一个返回 403 的请求可能非常“快”,一个CDN错误页也可能迅速返回。
只记录时间、不记录响应是否正确,容易把失败当成性能优秀。
常见问题
CDN测速需要测多少次才准确?
快速检查时,每个节点建议至少连续测5次;排查波动时,可以增加到10次,并跨多个时间段持续观察。
比次数更重要的是保持URL、地区、运营商和测试条件一致。
为什么第一次测速慢,第二次就快了?
可能是CDN缓存刚完成填充,也可能是DNS、本地缓存或TCP/TLS连接被复用。
需要同时查看缓存状态、Age、响应IP以及是否清除了浏览器缓存。
为什么本地访问很快,外地用户却很慢?
不同地区和运营商可能进入不同CDN节点和网络路径。
应从用户所在地区、运营商和IP协议重新测试,不能用本地结果代替对方的访问条件。
CDN测速应该看延迟还是下载速度?
小文件和网页入口更应该关注连接时间与TTFB,大文件下载、视频和软件分发还要关注持续吞吐。
两者解决的问题不同,不能只选一个数字。
P50正常、P95很高是什么意思?
说明大多数请求速度正常,但少部分请求明显更慢。
这正是用户所说“多数时候快,偶尔很卡”的典型表现,需要检查慢样本是否集中在特定节点、时间、运营商或缓存状态。
测速时要不要给URL加随机参数?
日常稳定性测试不要随意添加,因为随机参数可能形成新的缓存键。
如果需要测试冷缓存或强制回源,应单独设计测试组,并明确与正常缓存访问分开。
网站测速结果多少毫秒才算快?
没有脱离用户地区、文件大小、业务类型和缓存状态的统一答案。
与其套用一个固定阈值,不如先建立自己网站的稳定基线,再观察P50、P95、成功率和不同地区之间是否出现明显退化。
怎么判断慢的是CDN还是源站?
先看缓存状态和TTFB:缓存命中时正常、未命中时明显变慢,问题更可能与回源有关;所有请求都慢,则需要继续检查节点、网络和源站。
最终应使用CDN回源日志和源站日志确认,不能只凭一次客户端测速下结论。
总结:测“快不快”容易,测“稳不稳”才有价值
网站有时快有时慢,最怕的不是没有测速工具,而是拿一次结果解释所有用户。
真正有效的CDN测速需要做到:
固定页面、小文件和大文件,避免把不同测试对象混在一起;
区分首次访问、重复访问、缓存HIT和MISS;
从目标用户所在地区、运营商和IPv4/IPv6分别测试;
每个节点进行多轮采样,并覆盖不同时间段;
同时看DNS、TCP、TLS、TTFB、下载时间、P50、P95和成功率;
用CDN与源站日志确认慢请求最终发生在哪一层。
如果只是想快速确认问题分布,可以先使用 CdnChart网站测速,对同一URL进行多地区观察;如果测试结果连接到不同网络或出现多家CDN线索,再使用 CdnChart CDN检测 复核域名解析、响应IP和厂商特征。
不要急着追求一张“全绿”的测速截图。能把偶发慢请求稳定复现、找出它集中在哪个地区和哪个阶段,才是一次真正有用的CDN测速。
- 网站有时快有时慢
- CDN测速
- 网站速度不稳定
- 多地区网站测速
- CDN速度测试