在使用Squid做反向代理的CDN节点时.多线程大文件断点续传和流媒体的处理是怎么样啦.前些日子花了点时间研究了一下.
在Squid做反向代理时.其中有个range_offset_limit的参数,意思是预先读取.还有一个maximum_object_size的参数控制能缓存的大小.
当了解上面二个参数的意思,我们来讲讲实际中会怎么样.当maximum_object_size设置成100M,也就是最大能缓存的大小.另外range_offset_limit最大预先读取我们也先让他也为100M.当有个用户,比如使用迅雷下载squid中一个100M的文件时.照理他是缓存这个100M,然后其它的用户都是下载的缓存的.理想状态就是这样.
但是事实不是这样处理的,这个和用户和请求数有关,当用户开启了多线程,比如并发10个线程从这个节点下载.预先读取的参数会同时10个并发来缓存,那这样,每个10个进程,在第一次,一个100M的文件有可能下载到squid节点中100M*10(并发)=1000M,直到其中最快的一个并发都预先读取完了所有的要下载的那个文件.才会给文件缓存起来.这样之后的用户才会从缓存中得到文件.但这样下载的量非常大.很多没有必要的.这样也就是我们为什么就从Cacti中常常见到很奇怪的流量.
为了防备squid被多线程下载工具冲击,让squid用acl来禁止http header中带range请求.客户端的表现就是采用多线程下载的请求都会被squid拒绝,也就是多线程下载工具无法下载通过你的squid代理的站点上的东西了.
当然,也可以做业务拆分,让单个squid来缓冲这些大文件,和有可能出现多并发的文件.然后给内容最好主动推到CDN的节点上面.
近来在研究大文件Cache方面,squid对大文件处理方面的优化.其中发现二个最重要的参数range_offset_limit和quick_abort*.其实从名字中就能看得出来,二个最主要的分别就是一个是对大文件的range(断点续传)和abort(中断)的处理.
1. squid 中的 range_offset_limit
其实在前面几次提到过这个参数,也会有很多问题,一定要注意就是这个设置的比你的maximum_object_size要小.不然下载完,又放弃.
另外这个参数也会有个问题,就是当十个线程过来,它会同一个文件请求10次,不过总的来讲,这个参数少设置为好.
2.squid 中的 quick_abort
quick_abort_min (KB)
quick_abort_max (KB)
quick_abort_pct (percent)
控制squid是否继续传输被用户中断的请求.当用户中断请求时,squid把检测 quick_abort 的值.如果剩余部分小于“quick_abort_min”指定的值,squid 把继续完成剩余部分的传输;如果剩余部分大于“quick_abort_max”指定的值,squid 把终止剩余部分的传输;如果已完成“quick_abort_pct”指定的百分比,squid把继续完成剩余部分的传输.
比如我们对大量的大文件的cache系统可以这样处理
quick_abort_min 16 MB
quick_abort_max 16 MB
quick_abort_pct 80
3. squid 中的 collapsed_forwarding
多个回源流量变成一个回源,这个在大文件时,也比较有用,但是如果第一个用户很慢的话,会严重影响速度.
range_offset_limit 0
quick_abort_min 4 MB
quick_abort_max 4 MB
quick_abort_pct 90
转载请注明:爱开源 » 多线程大文件断点续传和流媒体的处理方法