边缘加速到底买到了什么:延迟、路由与缓存命中
CDN 只改变两件事:你的数据包要走多远,以及它是否需要走。两件都能测,而多数面板一件都没测准。
这两部分原本分开写,其实回答的是同一个问题的两端:CDN 究竟改变了什么。前半是距离——你的请求落在哪个边缘节点、那段路有多长、什么时候这个数字其实是自己网络的问题;后半是必要性——命中缓存时请求根本回不到源站,未命中时它比直连还要多走一段。两段放在一起,才能判断「全球加速」这句宣传对你这个站点是否成立。
人人都在报一个 ping 值,却几乎没人知道它到底测的是什么。往返耗时只有和"路径"与"测量时刻"放在一起才有意义。
一、光不会瞬间到达
在光纤中,光每毫秒大约走 200 公里。东京到法兰克福直线约 9300 公里,所以往返的物理下限就已经接近 93 毫秒——这还没算路由器、排队与 TLS 握手。任何远低于这个数字的公开数据,测的都是别的东西。
二、接入节点告诉了你什么
CDN 是从最近的存在点回应的,而不是从源站。这就是同一个站点在这个城市秒开、在那个城市却卡的原因:你量的是到边缘的距离,而不是到存放数据的服务器的距离。
三、还该同时看什么
- 波动,而不只是平均值。稳定的 120 毫秒,体验远好过平均 60 毫秒但会飙到 400 毫秒的抖动。
- 丢包。哪怕 1% 也会触发重传,在 TCP 上直接把吞吐打崩。
- 首包开销:DNS 查询、TCP 握手、TLS 协商,在传输任何一个字节内容之前就已经耗掉若干个往返。
- 时段。拥塞是有昼夜规律的,同一条链路在高峰时段会可预期地劣化。
四、自己动手测
多采几次样本、全部保留,再和回应你的接入节点一起看。如果节点很近但延迟很高,瓶颈在最后一公里或你的本地网络;如果节点很远,那这个数字是地理造成的,不是故障。
五、什么时候该怀疑自己的网络
如果同一个边缘节点在一天里的不同时段延迟差出三倍,问题几乎肯定不在 CDN:晚高峰的拥塞发生在接入网和最后一公里。判断方法很简单——同时 ping 你的网关和一个公网目标。网关也在抖,是本地无线或路由器的问题;网关稳定而公网目标抖,是运营商出口拥塞。这个区分能省掉一整轮和客服的无意义对话。
还有个细节值得留意:浏览器报出的时间包含 DNS 查询、TCP 握手与 TLS 协商。用 curl 单独测一次握手耗时,再和页面里那个数字对比——差得越多,说明首次访问的开销越大,也就越值得考虑预连接。
一个团队把站点迁到 CDN,看着面板上 92% 的命中率,然后收到用户反馈说站点变慢了。两件事都是真的,而且他们看的那个数字,并不是他们以为的那个东西。
六、先看什么真的可缓存
多数 CDN 出厂就带一条「按扩展名」的规则:图片、字体、CSS、JS 走缓存,HTML 不走。于是整站命中率可以很漂亮,而每一次页面跳转依然回到源站。面板把一百万次 favicon 请求和一千次文档请求平均在了一起。
Cloudflare 的默认行为正是按扩展名判断,所以除非写了 Cache Rule,HTML 响应会以 DYNAMIC 返回。正确的改法是给文档路由加一条缓存规则,再用 Cache-Control 把意图说清楚:public,加一个较短的 s-maxage,再加一个 stale-while-revalidate 窗口。
七、先看响应头,再看面板
打开开发者工具,找到这条请求,看 cf-cache-status。HIT 表示来自边缘;MISS 表示回了源站、现在可能已存入;EXPIRED 表示有副本但已过期;REVALIDATED 表示回源做了校验;BYPASS 表示有东西明确跳过了缓存,通常是 Cookie、规则或请求方法;DYNAMIC 表示平台认为这个响应根本不可缓存。六个状态里有四个意味着「没命中」,而其中只有一个算 bug。
八、四件会静默关掉缓存的事
- 在可缓存的响应上带了 Set-Cookie。多数 CDN 会拒绝存储设置 Cookie 的响应,因为那会把某个用户的会话泄露给别人。HTML 模板里多一个统计 Cookie 就足够触发。
- Vary: Cookie。即便你没有设置 Cookie,只要声明响应随它变化,每个访客就都成了一个独立的缓存键。
- 每次访问都是新 URL。会话 ID、防缓存时间戳,或者把每个 utm 参数都留在路径里,会把一个页面变成成千上万个各命中一次的条目。
- Cache-Control: private 或 no-store,常见来源是框架默认值,或者某次故障处理时加的规则、后来没人删掉。
九、命中率高不是目标
把页面缓存一天,你能做到 99%。同时你也在发昨天的价格。真正该问的不是「多少请求走了缓存」,而是「多少请求走了缓存、而且内容仍然是对的」。70% 的命中率加上合理的重验窗口,优于 99% 的命中率加上每次改稿都要手工清缓存。
要按路由度量,而不是按整站。博客列表和登录后的控制台活在同一个面板数字里,彼此毫无关系,平均起来同时掩盖了两边的问题。按路径模板抽样日志,看最差的十条路由,而不是全站平均数。
十、延迟的另一半
命中缓存仍然要付出到最近边缘节点的一次往返,而边缘节点由任播决定,不由你的数据库决定。如果源站只在一个区域,从地球另一边来的缓存未命中就是两段长途,而不是一段。这正是 CDN 真正有价值的场景——也正是在那里,一个正确配置的缓存不再是优化,而是 40 毫秒与 400 毫秒的差别。
ipbox.one 会显示实际应答你这次请求的边缘节点(colo),并与延迟采样并列,让你判断测到的数字来自你本地这一段,还是来自隔着大洋的某个节点。