前言
squid是眾多CDN廠商使用的核心緩存軟件,都在已有的基礎上進行二次開發。在部署squid的時候,建議遵循下面的規范。
1. 使用大內存服務器
對於熱點文件,我們讓squid用內存緩存,這樣大大提高響應速度,訪問日志access_log中體現為TCP_MEM_HIT。我們一般都是64g內存以上的服務器。
2. 推薦每個磁盤單獨使用
對於僅次於熱門文件的文件,我們采用磁盤緩存,squid是基於磁盤緩存的,不需要把磁盤設置成RAID 10 or RAID 5之類的,通過cache_dir配置使用每個獨立磁盤進行 緩存以提高磁盤iops,配置參數如下:
cache_dir ufs /mnt/sdb1 8096 32 256
3. 禁用atime更新
使用noatime,nodiratime來掛載文件系統。這樣在讀取磁盤緩存的時候不會更新相應的inode訪問時間。在/etc/fstab中的配置指令如下:
/dev/sdb1 /data/cache1 ext3 noatime,nodiratime 0 0
4. 配置多實例
所謂多實例就是啟動多個squid進程。因為squid以單進程運行,對多CPU的架構支持不好,不能夠重復利用多CPU處理器,配置多實例的時候,需要注意的是配置文件的部分參數;
visible_hostname、unique_hostname、http_port、snmp_port、access_log、cache_log、pid_filename、cache_dir。以上參數必須不同。
5. 使用URL作為調度算法
在配置squid的時候,采用URL作為hash算法,優點如是增加緩存命中率,相同的URl會訪問到squid的同一台服務器或者同一個實例上。避免重復回源和重復緩存同樣的文件,提高緩存命中率。
6. 禁用緩存間的通信協議
緩存間的通信協議設計初衷就是為了架構緩存集群,盡量減少對源站的訪問。目前有以下緩存間通信協議和方法:ICP,HTCP,Cache Digest,wccp,wccp2。從實踐來看,緩存間通信協議會導致緩存響應的延時,同時不利於問題的排錯,因此建議關閉緩存通信協議。禁用的方式就是在編譯安裝squid的時候添加以下參數
--disable-icap-client --disable-wccp --disable-wccpv2 --disable-htcp --disable-ident-lookups --disable-auto-locale --enable-ltdl-convenience
7. 構建二級緩存
所謂的二級緩存就是在CDN邊緣節點回源的時候先往CDN的核心節點獲取內容,也就是這樣的架構: CDN邊緣squid ---> CDN核心squid ---> 源站 。 CDN核心squid就是邊緣squid的上一級緩存,一級和二級緩存節點之間不使用緩存通信協議,直接使用HTTP進行內容獲取后緩存。
8. 使用squid Manager 獲取運行狀態
squid manager 提供了對squid運行狀態的詳細信息展示通道,在配置文件配置后就可以使用該功能,配置參數如下:
acl manager proto cache_object # 安裝好后默認配置就有。
cachemgr_passwd 123..aa config reconfigure shutdown
http_access allow manager localhost
http_access deny manager # 運行狀態信息不緩存,默認配置就有。
配置完成后,重啟squid,在使用如下命令查看下squid信息
當前運行狀態
[root@localhost ~]# squidclient -h 127.0.0.1 -p 3128 mgr:info #3128是squid 的默認端口
'''
Cache information for squid: # 重點關注cache信息
Hits as % of all requests: 5min: 0.0%, 60min: 0.0%
Hits as % of bytes sent: 5min: -0.0%, 60min: -0.0%
Memory hits as % of hit requests: 5min: 0.0%, 60min: 0.0%
Disk hits as % of hit requests: 5min: 0.0%, 60min: 0.0%
Storage Swap size: 0 KB
Storage Swap capacity: 0.0% used, 0.0% free
Storage Mem size: 104 KB
Storage Mem capacity: 0.0% used, 100.0% free
Mean Object Size: 0.00 KB
Requests given to unlinkd: 0
'''
當前配置
[root@localhost ~]# squidclient -h 127.0.0.1 -p 3128 -w 123..aa mgr:config #-w(小寫w)指明看squid配置中的manager密碼
9. 優化http range
Http range方法提供了允許客戶端只獲取某個靜態文件部分內容的能力,典型的Range請求的頭部信息如下:
GET /test.rar HTTP/1.1
Connection: close
Host: file.ljf.info
Range: bytes=1025-2048
上述頭部信息是說:客戶端想獲取http://file.ljf.info/test.rar 的文件從1024字節到2048字節的部分內容,這種請求方式在多線程下載器(如迅雷,快車),通過多線程分別獲取同一個URL的不同部分然后組合起來,可以提高下載速度。
在squid中,我們可以下面這個指令控制HTTP Range 請求的緩存:
range_offset_limit
我在工作中,根據squid回源流量進行調整,在剛上線的一台squid服務器,一般設置為0,0表示所有都存。這樣的情況下根據服務器負載的網絡流量跑個幾天再調調這個參數。
個人建議配置以下經驗值以平衡Range請求和緩存整個文件之間效率問題。
range_offset_limit 3 MB
這樣的配置后,如果用戶請求的起始Range字節的在3MB以內,如果squid本地沒有緩存過這個文件,那么squid就會向后端請求整個文件,然后再進行緩存。如果Range起始范圍超過了3MB,那么squid也是用range向后端請求,此時文件不會被緩存。
如有問題請與本人聯系,18500777133@sina.cn