总览
本书介绍了提高网站性能的14条规则:
- 减少HTTP请求
- 使用内容发布网络
- 添加Expires头
- 压缩组件
- 将样式表放在顶部
- 将脚本放在底部展示
- 避免CSS表达式
- 使用外部JavaScript和CSS
- 减少DNS查找
- 精简JavaScript
- 避免重定向
- 移除重复脚本
- 配置ETag
- 使Ajax可缓存
本书配套实例:点此访问
规则9-减少DNS查找
缩短响应时间
DNS缓存和TTL
- DNS查找可以被缓存起来以提高性能。包括不限于局域网中的缓存服务器(ISP),操作系统缓存,浏览器缓存
- 浏览器拥有自己的缓存记录,来直接减少浏览器查找DNS记录的时间。如果没有缓存记录,会向上层继续查找缓存
- 域名对应的IP地址会变化,所以应该周期性的清除缓存中的DNS记录
影响DNS缓存的因素
TTL:查找返回的DNS记录中包含了一个存活时间(TTL),告诉客户端这个记录可以缓存多久。
浏览器一般会忽略这个值,并设置自己的时间限制。keep-alive特性同时覆盖TTL和浏览器的时间限制。
浏览器对缓存记录的数量有限制。如果访问较多不同域名,较早的DNS记录会被删除。(操作系统可能依然保留有该记录,所以会继续较少DNS查询的开销)
TTL的值
网站发给客户端的最大TTL值在1min到1h之间,取决于网站的配置。
客户端收到的DNS记录的平均TTL值只有最大TTL值的一半。当浏览器进行DNS查找时,DNS解析器返回的时间是其记录的TTL的剩余时间。如果最大TTL是5min,DNS解析器返回的TTL范围可能是1~300s,平均是150s。对于给定的主机名,每次执行DNS查找时接收到的TTL的值会变化。
浏览器的视角
windows的缓存命令:
IE
通过修改注册表修改配置值,位置如下:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\InternetSettings\
- DNSCacheTimeout:30min - DNS缓存时间
- KeepAliveTimeout:1min - TCP连接允许空闲的时间
- ServerInfoTimeout:2min - 尽管没有Keep-Alive,如果一个域名每2min重用了一次,并且没有发生错误,也无需进行DNS查找
Firefox
Firefox的参数配置
- network.dnsCacheExpiration: 1h
- network.dnsCacheEntries: 512 - 可缓存的记录数
- network.http.keep-alive.timeout: 30s
减少DNS查找
- 减少唯一主机名的数量(相当于减少并行下载,可能会增加响应时间
建议是将页面组件分别放到至少2个,但不要超过4个主机名下
- Keep-Alive通过重用现有连接,避免了TCP/IP开销,同时可以减少DNS查找
最佳实践
通过使用Keep-Alive和较少的域名来减少DNS查找