性能优化小册 - 提高网页响应速度:优化你的 CDN 性能

1.使用高性能 DNS

CDN 服务本身并不具备域名解析功能,而是依托于 DNS 智能解析功能,由 DNS 根据用户所在地、所用线路进行智能分配最合适的 CDN 服务节点,然后把缓存在该服务节点的静态缓存内容返回给用户。

如果域名转换为 IP 这一过程可用性低且延迟高,那么肯定会对 CDN 性能产生不良影响。

另外,请确保在 DNS 记录上使用较高的 TTL(生存时间),以便解析器可以长时间缓存记录。

2.将源点移到 CDN 附近

保持 CDN 与源之间的等待时间短暂,是 CDN 应对缓存未命中响应的有效的优化方法。

如果无法将源站点放在 CDN 附近,请考虑使用源防护(origin shield)。

Origin shieldCDN 和源之间的额外缓存层。origin shield 有助于减轻源点负担,它会在在源级别将来自多个 edge CDN 的传入请求折叠成一个请求,以加快缓存未命中响应的速度。

一个好的 origin shield 可以减少 70%80% 的源负载,即使它前面有一个性能良好的 edge CDN

3.具有 IPv6 连接

IPv6 能提高「网速」通常是指新建的 IPv6 网络通常具有更大的带宽(比如中国正在新建的 CERNET2 骨干网动辄 10Gbps、100Gbps 的连接带宽)、更好的流量控制、更少的 NAT 从而实现更高效的网络拓扑结构(IP 地址资源多从而不需要对数据包进行多次地址翻译和转发)。在这些方面 IPv6 确实是能提高「网速」的。

Facebook 已经对 IPv6 对性能的影响进行了大量研究,并得出了积极的效果:

我们已经观察到,与 IPv6 相比,访问 Facebook 的速度可以提高 10-15%。

4.调整您的 initcwnd

原始服务器上的初始拥塞窗口参数(initcwnd)的值可能为 10。这意味着服务器在第一次往返过程中通过新连接发送了 10 个数据包。

值为 10 不是不可以,但是更高的 initcwnd 可能会对 TCP 性能产生明显的积极影响,从而导致源和 CDN 之间的内容传输更快。

一些 CDN 的 initcwnd 为 10,其他 CDN 的值则高得多。

重要提示:请勿「简单的」的增加服务器上的 initcwnd 值并认为这样会很好。

阅读更多:

5. 让连接永远存活

当 CDN 需要从您的源服务器中提取内容时,两个服务器之间必须存在 TCP 连接。

理想情况下,该连接已经存在并且可以重复使用,从而节省了建立新的连接时的往返时间和宝贵的毫秒值。

CDN 或源可能会终止连接,您无法控制 CDN 保持连接存活的时间,但是您可以控制源上的 keep-alive 行为。

永远不要在源端关闭连接 - 担心许多 CDN 服务器与您的源点建立 TCP 连接并且该源无法处理该问题?设置一个 Origin shield

6. 减少 TLS 连接时间

您有安全的 HTTPS 来源吗?如果是,可以执行几种优化来提高 CDN 性能。

举个例子:TLS 错误启动,TLS 会话恢复和 TLS 记录大小优化。

在开始使用这些 TLS 优化之前,请检查您的 CDN 是否需要其他方面的帮助,才能使这些优化生效。

进一步阅读:

7. 最小化字节大小

减少内容的字节大小或「权重」对于加快 CDN 性能非常有效。传输的字节越少,内容到达用户的速度就越快。

您可以通过多种方法来最小化字节大小以增强 CDN 性能,压缩是最有效且通常最容易实现的方法。

延伸阅读两篇减少字节大小的文章 minification图像优化

8. 成为缓存控制大师 - 强制缓存

如何使 CDN 尽可能长时间地缓存对象并最大化缓存命中率?

开箱即用,大多数或所有 CDN 都将遵循源服务器通过 Cache-Control 标头发送的缓存指令,这是提高 CDN 性能的非常有效的工具。

一些例子:
Cache-Control: max-age=86400 告诉 CDN 和浏览器该对象可能被缓存 86400 秒。

Cache-Control: max-age=3600, s-maxage=86400 通知 CDN 它可能将对象缓存 24 小时,而浏览器应将对象缓存不超过 1 小时。注意:s-maxage 默认情况下,并非所有 CDN `都支持。

Cache-Control: max-age=86400, stale-while-revalidate=300 指示 CDN 和浏览器将对象缓存 24 小时,然后在这 24 小时结束时,当从原始位置获取新内容时,CDN 可以提供陈旧的响应长达 300 秒。

推荐看本专栏这篇文章:彻底理解浏览器缓存机制

了解有关缓存控制的更多信息:

9. 启用条件请求 - 协商缓存

当 CDN 收到对过期对象的请求(在高速缓存中,但已过期)时,CDN 必须先联系源站点,然后再向用户发送响应。

如果缓存的对象具有Last-Modified / ETag 标头,则 CDN 可以通过添加 If-Modified-Since / If-None-Match 标头来有条件地发起请求,源站点可以决定以轻量级 304 非修改响应(只有标头响应),还是以 200 OK 重新返回响应(标头和正文)。

推荐看本专栏这篇文章:彻底理解浏览器缓存机制

显然,304 非修改响应的性能要优于 200 OK 响应,因为响应的大小要小得多,因此 CDN 与源之间的往返次数更少。

将原始服务器配置为始终发送 Last-Modified / ETag 标头,因为这大大有助于提高缓存的性能。

10. 注意 Vary 标头

你的源不应该向 CDN 提供带有诸如 Vary: RefererVary: User-AgentVary: CookieVary: User-Agent,Cookie 标头,这些 Vary 标头对缓存命中率和 CDN 性能有很大的负面影响。

重点:

  • 永远不要使用 Vary: *,具有该标头的对象将永远不会存储在 CDN 缓存中。
  • 始终发送 Vary: Accept-Encoding 带有(Gzip)压缩内容的标头。

进一步阅读:使用 Vary 标头的最佳做法

分享这篇文章的原因:我认为原作者是一位网络性能优化大师,他本人的博客优化的非常棒。

同系列文章:

参考链接:

阅读 3.6k

推荐阅读
前端 1943
用户专栏

前端技术文章

2463 人关注
21 篇文章
专栏主页