网站优化应重视 DNS 预获取(DNS Prefetching)

网站优化技术总是在进化。今天重新阅读了一下以前的前端优化笔记,发现对于 YSlow 优化 34 条准则关于减少 DNS 查找 (Reduce DNS Lookups)的部分或许应该修正一下了。

DNS 作为互联网的基础协议,其解析的速度似乎容易被网站优化人员忽视。现在浏览器厂商已经有在针对 DNS 进行优化,典型的一次 DNS 解析耗费 20-120 毫秒,减少 DNS 解析数是个优化的方式,而能够缩减 DNS 解析的时间也是有经济效益的事情。这就是浏览器厂商重视 DNS Prefetching 的主要原因。DNS Prefetching 对于性能的收益可以简单的用”DNS 同步请求到异步”来解释,也就是具有此属性的域名不需要用户点击链接就在后台解析,而域名解析和内容载入是串行的网络操作,所以这个方式能减少用户的等待时间,提升用户体验。

Google Chrome 内置就有 DNS Prefetching 技术(注意之前有几个小版本因为这一特性反而带来了性能问题) ,而 Firefox 3.5 也引入了这一 新特性。至于 IE 8,暂时还看不到有什么举措(或许是我没注意到?)。

对于一个网站来说,如果希望能充分利用用户浏览器端的这个功能,可以在页面添加 link 属性的锚点来做到。类似:

<link rel="dns-prefetch" href="http://www.google-analytics.com/">

另外还有这个 x-dns-prefetch-control 也有必要适当用一下。对于某些站点引用了 Google 的某些服务脚本,可能这尤其有用。

另外一种加速 DNS 的途径是考虑使用 pdnsd 之类的缓存 DNS 代理服务器来加速某些 DNS 请求。

在 Chrome 中,可以通过在地址栏输入 about:histograms/DNS 来观测一些有趣的 DNS 性能数据。

EOF


8 thoughts on “网站优化应重视 DNS 预获取(DNS Prefetching)

  1. fcicq

    pdnsd / dnsmasq 都是本地用的, 与比较新的浏览器搭配使用效果不明显, 因为这些浏览器都带 dns 缓存.
    dns-prefetch 的意义是为了后面再次用到这个域名, 所以说如 https://www.dbanotes.net 把 favicon 设置成 static.dbanotes.net/f.ico, 同样是在 内, 这样隐性的也达到了这个目的, 除非你认为解析的时间超过了 lookup 的时间.
    国内(离你最近的) DNS, 对于一般大型网站的单个域名解析加上网络开销应该在 20-40ms 左右. MISS 之后才会走流程去取这个数据(这确实很慢). 保证(在 TTL 内)总是新有人来访问的话, DNS 总是会 HIT 的. :)

    Reply
  2. Fenng

    @fcicq
    pdnsd / dnsmasq 是与浏览器没多大关系,但是服务端的方法也值得考虑,也是减少用户 Miss 的有效办法,毕竟不用到远程解析了
    其实,对于大型架构还有另外一个技巧… 不说了

    Reply
  3. yanleech

    @Fenng
    两位沟通不良的结果。。。 @fcicq 在留言中说的是, <head> 中那个小技巧(<link >)的用处不大,然后误理解你其后所说的 pdnsd/dnsmasq 是针对 client 的 dns cache 中使用了…个人建议这段修改一下,因为我第一次看也误解了… XD
    此外,你在留言所说的另一个技巧是?给挑起好奇心了… XD
    PS: 留言的 html tag 过滤太强了,很容易造成留言显示不完整吧?改成对 html tag 的转换而非去掉?

    Reply
  4. 袁源

    不小心看到 Fenng 的博客,难道就是那个大 V 冯大辉么?这个好赞,我是研究新浪微博 BigPipe 的时候看到的预先获取 DNS 的部分,查过来的。

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *