用squid缓冲windows update 再次遭遇vmware bug:kernel升级出错
九月 18

调整了range_offset_limit参数之后,会对squid的行为有什么影响呢?

在squid.conf.default里面,range_offset_limit参数下面的注释是这样的:
Sets a upper limit on how far into the the file a Range request may be to cause Squid to prefetch the whole file. If beyond this limit Squid forwards the Range request as it is and the result is NOT cached.

This is to stop a far ahead range request (lets say start at 17MB)from making Squid fetch the whole object up to that point before sending anything to the client.

A value of -1 causes Squid to always fetch the object from the beginning so it may cache the result. (2.0 style)

A value of 0 causes Squid to never fetch more than the client requested. (default)
基本上看懂了是不?不就是控制多线程下载的http请求目标是否会进入squid的cache嘛。上次不是为了用squid缓冲windows update ,折腾了半天,在以为搞明白了range_offset_limit的意义之后,我将手头上的squid服务器的range_offset_limit调整为20480 KB。可是这样的调整,是会带来很大的麻烦的......

请同学们仔细看看下面的这张图
range_offset_limit
请注意右上角那块我用红圈圈出来的区域----这就是我把squid的range_offset_limit调整成20480 KB之后的squid的流量示意:图中蓝线画出来的是用户的http访问请求从squid服务器读取的流量;绿色区域表示的是squid服务器为了满足用户的http访问而读取的外部网站所使用的流量。

看出门道了吧?在range_offset_limit参数调整了之后,squid服务器使用了大大超过用户正常访问需求的流量,这个不正常的流量甚至会影响到正常的用户http访问。原因在哪里?请同学们再仔细看squid.conf.default里面有关于range_offset_limit的这段注释的第一句话:

Sets a upper limit on how far into the the file a Range request may be to cause Squid to prefetch the whole file.

两个关键点:

  • prefetch是预取,预先读取的意思。
    那么,对于这块红色区域的流量我们就很容易解释了:squid在预先读取某部分用户的http请求的内容,于是squid服务器使用的流量就超过了给用户的流量。
  • 在什么样的情况下,squid会预先读取用户请求的内容呢?在用户请求多线程下载的文件的http请求的range大小在range_offset_limit的设定值之内,squid都将预先读取这个用户请求的文件。

那么,当squid预先读取的文件大小超过squid的maximum_object_size参数设置的时候会发生什么样的事情呢?squid会把这个文件放到它的cache里吗?不会的,squid是很讲规矩的,它会把这个花了不少精力载下来的东西很潇洒的就扔掉了。然后,再有客户用多线程工具请求同一个文件时,它又会再把这个无用功再继续坚持下去......

晕,squid同志这样搞真的是很浪费带宽的说。同学们一定这么想,那我们得根据我们squid的maximum_object_size大小来设置一个合理的range_offset_limit参数,要不然看着squid这样干傻事,真是让人心痛。可是这个range_offset_limit大小要怎么设置?设成maximum_object_size的1/10?这样就可以让squid预先抓取的文件肯定在maximum_object_size范围内,保证预抓取的东西都能放到cache里了??是的,如果你的用户使用的多线程下载工具最多就是开到10线程的话,一切如你所想;可是万一有人开了个11线程的下载呢......

没事,这样的人毕竟是少数,我们按正常用户的行为特征来考虑。是的,这也没有错,可是我们调整range_offset_limit这个参数的初衷在哪里?别人怎么考虑的我不清楚,我自己就是想用squid来缓冲windows的那些补丁文件,windows最大的补丁文件有多大?我不知道,我只知道一个windows xp sp2就有要300M,难道要我把squid的maximum_object_size开到300M??这么做的话,我一定是疯了,只怕squid的cache里面到时就充满了大堆大堆的电影之类的东西了。

那么,要怎样来调整squid,让它比较合理的满足我们用squid来缓冲windows update的补丁呢?请听下文分解

14 Responses to “看图学英文:range_offset_limit参数对squid的影响”

  1. iakuf Says:

    下文分解,下文了很多天了哦.那个update更新,还是不理解,只是理解这个一定要设置的比maximum_object_size小,然后range_offset_limit的意思是请求多线程下载这个文件会先读这个文件的多线程的一部分.

    但要怎么样设置合理?

  2. coolzsb Says:

    准确的说,很多天到今天为止是整整225天了......

    2008年三月 30 日 10:37 pm,iakuf大声嚷嚷道:

    下文分解,下文了很多天了哦.

    你的理解是正确的,要怎么设置?要用好squid,就要懂得业务分拆,一个squid实例搞不定的事,可以多分拆一个squid实例来专门应付windows update:反正squid不支持SMP的,多跑一个squid实例又怕什么,不过还是会有问题的。反正range_offset_limit开启之后,肯定会导致带宽浪费的情况,做到squid业务分拆之后要怎么防止带宽浪费的情况出现呢?给你留个课后作业吧

    2008年三月 30 日 10:37 pm,iakuf大声嚷嚷道:

    那个update更新,还是不理解,只是理解这个一定要设置的比maximum_object_size小,然后range_offset_limit的意思是请求多线程下载这个文件会先读这个文件的多线程的一部分.

    但要怎么样设置合理?

    签名
    ---
    很多东西,自己想出来的会比较有趣

  3. iakuf Says:

    http://glob.com.au/windowsupdate_cache/

  4. iakuf Says:

    range_offset_limit 设置200k

  5. iakuf Says:

    我检查了部分squid 中的更新记录,发现大部分的windows update的包都分成了100k的样子大小的包,所以当range_offset_limit大过200k,就没有多少用了.我没有检查所有,我想大部分是这样,我让cache最大缓存4M,所以高过4M的就不会缓存,就直接下载,但小的update我想都能缓存起来.

  6. coolzsb Says:

    大致就是这个解决思路,只不过,我是专门设置了个squid的实例来应付那些有update的站点:这个squid的maximum_object_size可以设个比较大的值、这个squid实例只针对特定的站点作缓存;重要的一步在于,将你提到的那个站点的redirector脚本改换成直接用wget通过这个专门的squid实例去下update,这样的话,这个squid实例就会缓存特定站点的文件、不管多大都能缓存---而不管这个squid实例根本就没有开启range_offset_limit

    再然后,你也该知道啦:让原有的squid与这个squid实例成为silbing,把针对特定站点的web访问update请求扔到这个squid实例上,于是万事OK了

    2008年三月 31 日 2:46 pm,iakuf大声嚷嚷道:

    http://glob.com.au/windowsupdate_cache/

    签名
    ---
    至于具体的细节,实在是懒得写了,请大家鄙视得不要太厉害,谢谢

  7. iakuf Says:

    鄙视得不要太厉害.

    没事,不鄙视太厉害.只是非常厉害的鄙视. :em72:

    哈哈.不过啦,我只是给maximum_object_size开到8M
    range_offset_limit 200k
    给普通的搞定就好了

  8. iakuf Says:

    高.实在是高,现在想起来真的.高.
    让原有的squid与这个squid实例成为silbing,把针对特定站点的web访问update请求扔到这个squid实例上,于是万事OK了

  9. peterzsk Says:

    天书 :em26:

  10. coolzsb Says:

    你要看得懂的话,你就是复合型的人才了

    2008年四月 2 日 4:38 pm,peterzsk大声嚷嚷道:

    天书 :em26:

    签名
    ---
    21世纪最缺的是什么?人才

  11. iakuf Says:

    很好,很强大....我在怀疑,你的工作是做什么的?

  12. psp Says:

    2008年四月 3 日 4:36 pm,iakuf大声嚷嚷道:

    很好,很强大....我在怀疑,你的工作是做什么的?

    tell me now :em30:

  13. iakuf Says:

    又看了一下squid的手册,用-1不是可直接读到squid.那就这样设置好了,只要那个值小过maximum_object_size都没有问题.只是要是单个线程大过max就会多读点不要,所以maximum_object_size我认为开到合适对update比较合适

  14. coolzsb Says:

    我个人的意见是:最好还是不要开range_offset_limit来的比较妥

    2008年四月 13 日 1:53 pm,iakuf大声嚷嚷道:

    又看了一下squid的手册,用-1不是可直接读到squid.那就这样设置好了,只要那个值小过maximum_object_size都没有问题.只是要是单个线程大过max就会多读点不要,所以maximum_object_size我认为开到合适对update比较合适

    签名
    ---
    我算是被它折腾坏了

Leave a Reply