最佳实践10:配置和优化Squid
Squid是对HTTP协议遵从性最好的缓存软件,因此它在CDN中得到了大量的部署,是众多CDN公司使用到的核心缓存软件。在部署Squid时,建议遵从以下的规范。
推荐使用大内存服务器
对于热点文件,Squid使用内存进行缓存,在access_log中体现为TCP_MEM_HIT。因为使用了高速内存缓存机制,从而避免了从磁盘读入缓存内容,所以TCP_MEM_HIT是最高效的缓存方法。服务器所需要的内存,以能够完全容纳本站点的所有热点文件为标准。
推荐每个磁盘独立使用
对于过大的文件或者非经常访问的文件,Squid使用基于磁盘的缓存。在创建磁盘缓存时,不需要将磁盘组配置成RAID 10或者RAID 5、RAID 6,通过cache_dir配置直接使用每个独立磁盘进行缓存以提高磁盘iops。配置指令如下:
cache_dir ufs /mnt/sdb1 8096 32 256 cache_dir ufs /mnt/sdc1 8096 32 256 cache_dir ufs /mnt/sdd1 8096 32 256 cache_dir ufs /mnt/sde1 8096 32 256
禁用atime更新
使用noatime选项来mount的文件系统,不会在读取磁盘缓存时更新相应的inode访问时间。在/etc/fstab中的配置指令如下:
/dev/sdb1 /mnt/sdb1 ext3 noatime,nodiratime 0 0
配置Squid多实例
Squid以单进程运行,对多CPU的架构支持不好,不能重复利用多CPU处理器代理的高性能。解决这个问题的思路是在部署Squid的服务器上,部署Squid多个实例进程。在部署多个实例时,需要注意每个Squid实例的以下配置项目必须不同:visible_hostname、unique_hostname、http_port、snmp_port、access_log、cache_log、pid_filename、cache_dir。
使用URL哈希方法对Squid多实例进行调度
参考图2-2所示的CDN节点的典型架构图,对Squid多实例进行负载均衡时,务必使用URL哈希方法。采用这个方法的好处如下。
·增加缓存命中率。相同的URL访问到同一个Squid实例上,可以提高Squid缓存命中率。
·避免Squid上缓存文件的重复。使用URL哈希后,不同的Squid上缓存不同的文件,因此可以大大节省Squid磁盘缓存空间和内存缓存空间。
禁用缓存间通信协议
缓存间通信协议的设计初衷是为了架构缓存集群,尽量减少对源站的访问。目前主要有以下缓存间通信协议和方法:ICP、HTCP、Cache Digest、WCCP、WCCP2。从实践来看,缓存间通信协议会导致缓存响应的延时,同时不利于问题的排查。因此,建议所有的Squid实例都单独提供缓存服务,不进行缓存间协议通信。禁用的方式是在编译时加入以下指令:
configure options: '--prefix=/usr/local/squid' '--disable-icap-client' '--disable-wccp' '--disable-wccpv2' '--disable-htcp' '--disable-ident-lookups' '--disable-auto-locale' --enable-ltdl-convenience
架构二级缓存
在实践中,往往会部署二级缓存节点以减少回源站的流量。一级缓存节点是指最边缘的缓存节点,是直接服务于终端用户的节点。二级缓存节点,在架构上实际上被一级缓存节点认为是源站,而不是缓存节点。一级缓存节点和二级缓存节点之间,并不使用缓存间通信协议,而是直接使用HTTP进行内容获取或者缓存内容验证。可以使用如下配置指令:
cache_peer 10.1.6.38 parent 80 0 no-query originserver round-robin no-digest no-netdb-exchange name=server_xufeng_info acl sites_xufeng_info dstdomain .xufeng.info cache_peer_access server_xufeng_info allow sites_xufeng_info
使用Squid Manager获取运行状态
Squid Manager提供了对Squid运行进程状态的详细信息展示通道,在配置文件中使用如下指令配置后,即可使用该功能:
acl manager proto cache_object cachemgr_passwd 6ByhK4fx config reconfigure shutdown http_access allow manager localhost http_access deny manager
主要使用的命令包括以下两类。
·查看Squid运行状态的命令:
# /usr/local/squid/bin/squidclient -h 127.0.0.1 -p 80 mgr:info 主要关注以下的输出(命中率一般应该高于80%): Cache information for squid: Hits as % of all requests: 5min: 95.0%, 60min: 91.0% #请求命中率(按次数计算) Hits as % of bytes sent: 5min: 86.0%, 60min: 84.0% #请求命中率(按字节数计算) Memory hits as % of hit requests: 5min: 90.0%, 60min: 82.0% #内存缓存命中率
·查看当前Squid运行的配置的命令:
# /usr/local/squid.bak/bin/squidclient -h 127.0.0.1 -p 80 -w 6ByhK4fx mgr:config #使用-w(小写)指定在Squid中配置的Manager密码
优化HTTP Range
HTTP Range方法提供了允许客户端只获取某个静态文件部分内容的能力。典型的Range请求的头部信息(部分)如下:
GET /test.rar HTTP/1.1 Connection: close Host: file.xufeng.info Range: bytes=1025-2048
这个请求的含义是:客户端希望读取获取http://file.xufeng.info/test.rar文件的从1025字节到2048字节的部分内容。这种请求方式在多线程下载器(如迅雷、Flashget)中比较常见,通过多个线程分别获取同一个URL的不同部分然后组合起来,可以提高下载速度。
在Squid中,以下指令用于控制对HTTP Range请求的缓存行为:
range_offset_limit
在实践中,建议配置为以下值以平衡Range请求和缓存整个文件之间效率问题:
range_offset_limit 3 MB
这样配置后,如果用户请求的起始Range字节在3MB以内,如Squid本地没有缓存过该文件,那么Squid会向后端请求整个文件,然后进行缓存。如果Range的起始范围超过3MB,则Squid也使用Range向后端请求,此时文件不会被缓存。