减少 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 查找。