Squid 高階優化指南

2021-08-29 19:46:39 字數 3850 閱讀 1013

本文基本是一些方向性的指導,並不涉及像具體配置檔案的細節,因此本文裡面的內容大部分不能往配置檔案裡面 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 命中率馬上上公升一截。

其實觀察 sohu, sina 之類的頁面,你會發現它們的頁面也是分拆的,可以看到頁面裡面的都是指向 images.sohu.com 之類的位址,雖然它們可能和其他頁面一樣後台都指向同乙個 apache。

這樣做完,快取命中率大概能上公升到 70%-80% 了,運氣好的時候完全可以上 90%。

只要悉心按照訪問模式來拆分業務,大部分起快取作用的 squid 都可以達到很高的命中率,至少都可以到達 9x%。

c 根據不同的需求,調整引數優化快取

完成 a 和 b 兩步優化以後, squid 的命中率經常可以達到 9x%, 可以說我們已經給 squid 創造了非常優秀的外部環境,下面我們就要從 squid 本身入手,通過調整它的快取引數和快取策略,甚至系統的引數,來讓 squid 發揮出更好的效能。

在 b 步驟中,我們把 squid 劃分成了三種用途,快取大檔案,快取小檔案,不快取檔案,這其中最後一種用途情況下面 squid 不起到快取效果,只用來做連線管理,因此我們把它放到後面的連線管理裡面敘述,這裡只討論和快取相關的 squid 引數。

squid 有記憶體快取和磁碟快取兩級快取, 通常來說, 只要是專門給 squid 用的機器, 記憶體快取都建議開得比較大, 大記憶體快取總是有好處的嘛, 但是注意不要使得系統開始吃 swap ,像linux這樣一開始吃 swap 效能就下降比較嚴重的系統尤其要注意. 這個程度需要自己試驗確定.

通常 1g 記憶體的linux機器用來跑 squid ,記憶體快取可以開到 512m.

有些libc比較差的平台, 例如比較老的 freebsd 系統, 其 malloc 函式的質量不高,可能會造成比較多的記憶體碎片,導致 squid 執行一段時間以後分配不出來記憶體掛掉. 這時候推薦在編譯時候使用 dlmalloc package. 即使如此, 仍然要再縮小 squid 的記憶體快取,以防不幸發生.

磁碟快取的情況比較複雜, squid 有 ufs, aufs, coss, diskd, null 五種儲存後端, 其中 ufs, aufs, diskd 都是在檔案系統上面儲存很多小檔案, coss 是 squid 自己實現了乙個簡單的檔案系統,可以使用乙個大檔案或者乙個磁碟裝置來儲存. null 則是給不想要磁碟快取的情況準備的. coss 看起來好像比較拽, 但是以前試驗並不足夠穩定,因此並不推薦使用. 剩下的三種儲存方式,具體選擇哪種需要根據作業系統的特性來進行.

ufs 是最傳統的儲存方式, 我們知道, squid 是乙個單程序的程式, 它使用 ufs 儲存後端時, 直接在程序裡面讀寫檔案. 這是一種很簡單的方式, 缺點是當讀寫磁碟被阻塞的時候, squid 不能夠處理請求, 會造成服務質量波動比較大. 因此出現了 aufs 和 diskd 兩種儲存後端, 原理都是 squid 主服務迴圈不負責讀寫檔案, 而是通過訊息佇列或者tcp/pipe連線將資料傳送給其他的執行緒(aufs)/程序(diskd), 然後其他執行緒/程序進行讀寫. 很顯然,這兩種儲存方式有一定的通訊開銷, 因此不一定就比 ufs 好, 需要具體問題具體分析

前面說到, ufs/aufs/diskd都是在檔案系統上面儲存很多小檔案,因此檔案系統本身的特性嚴重影響了squid快取的效能,對於 linux ,強烈推薦用 reiserfs 等適合處理小檔案的檔案系統, bsd 則至少要開啟 softupdate, 以及 dirhash 等一切對很多小檔案有好處的選項. 在比較新的系統上面, reiserfs 等檔案系統的效能已經足夠優越, 通常 ufs 就已經可以應付需要. 對於一些老系統,使用 aufs 或者 diskd 是比較好的選擇,如果系統的執行緒庫比較好(如linux,solaris),那麼使用 aufs, 否則 diskd.

也有一些例外情況, 比如多 cpu 的 linux 2.6 系統, 執行緒庫很優秀, 雖然 ufs 本身已經比較快了,但是 squid 單程序無法利用另外的 cpu , 不如使用 aufs , 讓另外的 cpu 也可以起到一些作用, aufs 在編譯的時候可以選擇使用幾個讀寫執行緒. 這個個人覺得稍微超過 cpu 個數就可以了.但是並沒有實際測試過.

磁碟快取開多大? 這個問題沒有固定答案. 需要經過試驗來確定, 一般來說開大一些沒有太大問題. 只要你的硬碟足夠

squid優化鏈結

一 squid的推薦學習及基礎配置 1.squid學習指南 彭勇華 二,squid2.6基礎配置重要語法詳解 撫琴煮酒 523c1c8618bf2e.html 3.squid3.0做反向 伺服器 冷鋒 f379d1f2d38599.html 4.squid3.0與squid.26的區別 netsee...

優化squid配置

設定執行時的使用者和組許可權 cache effective user squid cache effective group squid 設定管理 資訊 visible hostname proxy.yxtc.edu.cn cache mgr email bye2000 yxtc.edu.cn e...

squid配置指南及問題

基本配置 具體是對squid.conf進行配置,安裝配置路徑參考安裝目錄下的install檔案。安裝完成後,接下來要對squid的執行進行配置 不是前面安裝時的配置 所有專案都在squid.conf中完成。squid自帶的squid.conf包括非常詳盡的說明,相當於一篇使用者手冊,對配置有任何疑問...