《高性能网站建设指南》规则9—减少DNS查找

减少DNS查找

DNS将主机名映射到IP地址上,在DNS查找的响应时间依赖于DNS解析器(通常由你的ISP提供),它所承担的请求压力、你与它之前的距离和你的带宽速度。

DNS缓存和TTL

DNS查找可以被缓存起来以提高性能。这种缓存可以发生在由你的ISP或者局域网中的一台特殊的缓存服务器上,但我们这里要探索的是发生在独立用户的计算机上的DNS缓存。
例如,在用户请求了一个主机名之后,DNS信息会留在操作系统的DNS缓存中,之后对于该主机名的请求将无需进行过多的DNS查找,至少短时间内不需要。

很多浏览器拥有其自己的缓存,和操作系统的缓存相分离。只要浏览器在其缓存中保留了DNS记录,它就不会麻烦操作系统来请求这个记录。只有当浏览器缓存丢失了记录时,它才会向操作系统询问地址——然后操作系统或者通过其缓存来响应这个请求,或者将请求发送给一台远程服务器,这时就会发生潜在的速度降低。

设计者知道IP地址会变化以及缓存会消耗内存。因此,应该周期性地清除缓存中的DNS记录,并通过大量不同的配置设置检测清除的频率有多高。

影响DNS缓存的因素

服务器可以表明记录可以被缓存多久。查找返回的DNS记录包含了一个存活时间(Time-to-live,TTL)值。该值告诉客户端可以对该记录缓存多久。

尽管操作系统缓存会考虑TTL值,但浏览器通常忽略该值,并设置它自己的时间限制。此外Keep-Alive特性可以同时覆盖TTL和浏览器的时间限制。只要浏览器和web服务器通信着,并保持TCP连接打开的状态,就没有理由进行DNS查找。

浏览器对缓存的DNS记录的数量也有限制,而不管缓存记录的时间,访问较多的域名,较早的DNS记录将被丢弃。不过操作系统可能依然保留着该记录,这能扭转一下局面。

TTL值

不同网站的TTL值差距很大,许多网站都在努力做到当服务器、虚拟IP地址(VIP)或联合定位掉线时提供快速故障转移。这也是提供较多TTL的原因。MySpace定位到一个联合定位工具,对于其当前的网络拓扑,故障转移并不是很重要,因此他们选择了较长的TTL。

客户端收到的DNS记录的平均TTL值只有最大TTL值的一半。这是因为DNS解析器自身也拥有与DNS记录相关的TTL。当浏览器进行DNS查找时,DNS解析器返回的时间是其记录的TTL的剩余时间。如果最大TTL是5分钟,DNS解析器返回的TTL范围可能是1~300秒。

浏览器视角

Microsoft Windows上的DNS缓存由DNS Client服务进行管理。你可以使用ipconfig命令来查看和刷新DNS Client服务。

ipconfig /displaydns
ipconfig /flushdns

重新启动也可以清空DNS Client服务缓存。重新启动浏览器会清空浏览器缓存,但不会清空DNS Client服务缓存。

IE

IE的DNS缓存由三个注册表设置控制

部分设置的默认值值如下:
DnsCacheTimeout——30分钟
KeepAliveTimeout--1分钟
ServerInfoTimeout--2分钟

如果DNS服务器TTL值小于30分钟的话,对浏览器进行DNS查找的频率产生的影响很小。一旦浏览器缓存了DNS记录,就会使用30分钟作为TTL值。如果发生了错误,刷新DNS查找就会比这要快,在正常情况下,很短的TTL值(30min以下)在IE中不会增加DNS查找的数量。

Keep-Alive,一个持久的TCP连接将会一直使用,直到其空闲1分钟为止。由于连接是持久的,因此无需DNS查找。

ServerInfoTimeout的值为2分钟,说明尽管没有Keep-Alive,如果一个主机名每两分钟重用了一次,并且没有发生错误,也无需尽心DNS查找。

当网络操作中心尝试通过DNS变化来转移流量时,如果一个IP上的流量已经被转移走,但该IP仍在运行,则使用旧的DNS记录的IE用户至少需要30分钟才能更新DNS。至少每两分钟访问一次的活跃用户会一直使用旧的IP,直到发生错误。

Firefox

具有下列配置设置

1.network.dnsCacheExpiration-1分钟
2.network.dnsCacheEntries-20
3.network.http.keep-alive.timeout-5分钟

减少DNS查找

当客户端的DNS缓存为空(浏览器和操作系统都是)时,DNS查找的数量与web页面中唯一主机名的数量相等。减少唯一主机名的数量就可以减少DNS查找的数量。

减少唯一主机名的数量会潜在地减少页面中并行下载的数量。

我的建议是将组件分别放到至少2个,但不要超过4个主机名下。

另外,确保服务器支持Keep-Alive还能减少DNS查找。

你可能感兴趣的:(javascript)