返回首页
当前位置: 主页 > 操作系统 > Linux教程 >

squid 优化指南

时间:2015-02-27 23:44来源:电脑教程学习网 www.etwiki.cn 编辑:admin

很多squid 优化只限于在 squid
参数和系统参数上面的调整。但是这个实在只是细枝末节的事情,只要不是太弱智的配置导致无法缓存,squid的性能不会有太大差距,也就提高10%左右,只有实际的业务针对
squid 进行一些调整,squid 才会真正爆发出他的能量,很多时候有 100%-200% 的提升。

本文基本是一些方向性的指导,并不涉及像具体配置文件的细节,因此本文里面的内容大部分不能往配置文件里面 copy-paste。。

首先要明确一下,squid 能够用来作什么。很多人没有搞明白 squid 的工作原理,只是听说 squid
性能不错可以用来给网站提速,就直接在自己的 website 前面套了一个 squid
,这基本没有任何用处,即使你都是静态页面,后面apache上面没有开
mod_expires,一样缓存不了,squid只能起到一个连接管理的用处。

一般说来,网站用 squid 加速,目的有二

1: squid 本身具有缓存功能,可以将webserver输出的内容缓存起来,在缓存没有过期之前来的访问,都直接用缓存里面的内容,这样可以有效减少
webserver 机器上面的请求数量。这是 squid 的主要功用。
2: 网络慢的用户会长时间占用 webserver 的 TCP 连接,webserver
对每个连接占用的资源比较大,如果长时间不能释放出来服务其他请求,性能会有比较大的影响。前面放一个 squid, webserver
就可以迅速处理完逻辑以后,把数据快速发送给 squid, 然后去处理别的逻辑,而 squid 每个 TCP
连接占用的资源很少,不用担心占用太多资源。这个用途也叫做连接管理,有一些网络设备也可以做这个事情,价格都很贵。

下面针对 squid 的两种功用,来讲述如何调整业务逻辑和 squid 参数

零:预操作

在搞 squid 之前,不管你用什么编译配置,需要什么特殊选项,都请 enable-snmp ,并配置好 mrtg
之类,可以图形化的显示 squid 状态,例如 Request Hit Ratio(RHR), Byte Hit Ratio(BHR),
等等,反馈是做一切事情的基础,优化也不例外。

 

一:缓存

A: 使用 Expires header 来控制缓存

squid在缓存webserver内容的时候,需要后端webserver输出一些控制信息告诉他页面是不是可以被缓存,以及可以缓存多久。否则
squid 是不会自作主张给你缓存内容的。一个页面到底能不能缓存,只有开发网站的人才知道,因此开发人员有责任在动态页面里面输出
Expires 和 Cache-Control header。简单举一个 php 的例子以说明这两个 header
的值是什么含义,其中$expiretime 的单位是秒。

header("Expires: " . gmt_date_format(time()+$expiretime));
header("Cache-Control: max-age=" . "$expiretime");

对于静态文件,有两种方式来让 squid 自动给静态文件缓存,一种是使用 apache 的 mod_expires
,可以针对路径或者针对文件类型/扩展名来自动输出 cache 头。详细的请参考 mod_expires 的说明 。另一种是用 squid 的
refresh_pattern 来指定。详细的还是请参考 squid
的配置文件。一般来说,如果后端不是配置很麻烦,建议还是在后端做,前端的配置修改大多数都是违背http协议的,如果出现问题,也比较难排查。

 

B 根据 squid 访问的模式,进行业务拆分

 进行了 Expires Header 的处理以后,squid
就真正可以起到加速的作用了,你可能也能感觉到,网站的访问速度明显加快。但是不要满足于这点成绩,查看 squid 的 snmp 统计图,通常
hit ratio 并不会太高,有 50% 就了不起了。这就是我们需要进一步优化的,我们的目标是让大部分 squid 都达到 9X%
的命中率。

为什么 squid 命中这么低呢,这大概有两种原因。大多数的网站都是有一些页面不能够被缓存的,例如登录页面。这些页面请求也从
squid 走,成为分母的一部分,直接就降低了命中率,我们首先可以做的事情是,把这些不能够缓存的页面请求,拆分到单独一个 squid
上面,或者访问量不大的话,干脆把 apache 暴露出来。这样能够缓存的那个 squid 命中率马上上升一截。

 有人可能会说,把不能缓存的页面分拆开去,就光为了让能缓存的那个数字好看,这不是掩耳盗铃么?其实这么做是有意义的,首先就是去掉了不能缓存页面的干扰,使得我们进一步优化
squid 的依据更加准确。其次是不可缓存请求和可缓存请求之间的重要性通常是有差距的,分拆了以后,它们之间不容易互相抢占资源,不会因为下载图片的连接太多把
squid 占满,影响更重要的登录请求。第三就是可缓存内容通常是图片等页面元素, 浏览器在 load
它们的时候,对每个站点的并发连接会有控制,如果分开成不同的IP,可以多一些请求同时执行。提高少许显示速度。

其实观察 sohu, sina 之类的页面,你会发现它们的页面也是分拆的,可以看到页面里面的图片都是指向
images.sohu.com 之类的地址,虽然它们可能和其他页面一样后台都指向同一个 apache。

 这样做完,缓存命中率大概能上升到 70%-80% 了,运气好的时候完全可以上 90%。

另一种导致 squid
命中低的原因和这个比较类似,同样都是可缓存的内容,有的可能是软件下载站上面的大文件,有的是新闻站点上面的小图片,如果同一个 squid
对这样差别巨大的文件加速的话,会严重干扰 squid 的缓存策略,两者不能兼顾,要不就是大文件占据了 cache ,把小文件都挤出了
cache, 要不就是小文件特别多,大文件无法进入 cache, 导致大文件经常 miss
。这个比不能缓存的页面还要恶心,因此即使在服务器资源有限的情况下,也要优先拆分这两类型访问。一般来说,文件大小分界线定在 1M
左右就可以了,如果是有软件下载这样特别大的文件,可以在 4M - 10M 左右再拆分一次。对于不同访问类型的 squid,
其系统优化参数也会有所不同,这个我们后面还会讲到。

 只要悉心按照访问模式来拆分业务,大部分起缓存作用的 squid 都可以达到很高的命中率,至少都可以到达 9X%。

 

C 根据不同的需求,调整参数优化缓存

完成 A 和 B 两步优化以后, squid 的命中率经常可以达到 9x%, 可以说我们已经给 squid

------分隔线----------------------------
标签(Tag):Linux Android Ubuntu Unix 操作系统 fedora debian
------分隔线----------------------------
推荐内容
猜你感兴趣