在使用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的節點上面.ui
近來在研究大文件Cache方面,squid對大文件處理方面的優化.其中發現二個最重要的參數range_offset_limit和quick_abort*.其實從名字中就能看得出來,二個最主要的分別就是一個是對大文件的range(斷點續傳)和abort(中斷)的處理.spa
1. squid 中的 range_offset_limit線程
其實在前面幾回提到過這個參數,也會有不少問題,必定要注意就是這個設置的比你的maximum_object_size要小.否則下載完,又放棄.代理
另外這個參數也會有個問題,就是當十個線程過來,它會同一個文件請求10次,不過總的來說,這個參數少設置爲好.orm
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 0quick_abort_min 4 MBquick_abort_max 4 MBquick_abort_pct 90