歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

squid 優化指南

很多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

Copyright © Linux教程網 All Rights Reserved