2009年3月16日 星期一

squid 優化(解釋篇)

Squid 在高負載下,需要大量的內核資源。特別的,你需要給你的系統組態比正常情況更高的檔描述符和緩存。檔描述符的限制通常很惱人。你最好在開始編譯squid 之前來增加這些限制的大小。

1. 檔描述符

檔描述符是一個簡單的整數,用以標明每一個被進程所打開的檔和socket。第一個打開的檔是0,第二個是1,依此類推。Unix 作業系統通常給每個進程能打開的檔數量強加一個限制。更甚的是,unix 通常有一個系統級的限制。

因 為squid 的工作方式,檔描述符的限制可能會極大的影響性能。當squid 用完所有的檔描述符後,它不能接收用戶新的連接。也就是說,用完檔描述符導致拒絕服務。直到一部分當前請求完成,相應的檔和socket 被關閉,squid 不能接收新請求。當squid發現檔描述符短缺時,它會發佈警告。

通常情況下,Squid 預設為1024個檔描述,一般情況已經夠用。當系同高度繁忙時,肯能會用到4096個或更大。在編譯 Squid 前推薦將描述符更改至,系統限制級別的 2~3倍。

在linux系統下使用 ulimit -n 命令查看當前系統定義的檔描述符數量。

shell> ulimit -n

編譯修改/usr/include/bits/typesizes.h 標頭檔內的__FD_SETSIZE 值

#define __FD_SETSIZE 65536

使用ulimit -Hn 命令增加Kernel對檔描述符的限制,不必重啟機器

shell> echo 65536 > /proc/sys/fs/file-max

shell> ulimit -Hn 65536

2. 臨時埠號

臨時埠是TCP/IP 棧分配給出去連接的本地埠。換句話說,當squid 發起一條連接到另一台伺服器,內核給本地socket 分配一個埠號。這些本地埠號有特定的範圍限制。

臨時埠號短缺,對繁忙的Squid Server(每秒數百個連結)影響很大,當埠號不夠
用過時連結會進入 TIME_WAIT 狀態。在調試 Squid 時需要使用命令

shell> netstat -an |grep TIME_WAIT

在linux系統上,增加可用的臨時埠號(如:1024~44444)

shell> echo "1024 40000" >/proc/sys/net/ipv4/ip_local_port_range

3.configure Squid

./configure
--prefix=/usr/local/squid
--enable-epoll
--enable-storeio=aufs,diskd,ufs
--enable-async-io
--with-aufs-threads="N_thread"(多少執行緒工作)
--enable-removal-policies="LIST"(2.5為3種排除機制)

注:一下參數僅為參考,實際情況要根據Squid 版本來操作!

./configure 腳本有大量的不同選項,它們以-開始。當你敲入./configure --help 時,能看到選項的完整清單。一些選項對所有configure 腳本是通用的,還有一些是squid 專有的。下面是你可能用得到的標準選項:

--perfix =PREFIX
如前面描述的一樣,這裡設置安裝目錄。安裝目錄是所有可執行檔,日誌,和設定檔的預設目錄。在整本書中,$prefix 指你選擇的安裝目錄。

--localstatedir =DIR
該選項允許你改變var 目錄的安裝位置。默認是$prefix/var,但也許你想改變它,以使squid 的磁片緩存和日誌檔被存儲在別的地方。

--sysconfdir =DIR
該選項允許你改變etc 目錄的位置。默認的是$prefix/etc。假如你想使用/usr 作為安裝位置,你也許該配置--sysconfdir為/etc.

3-1. 以下是squid 的專有./configure選項:

--enable-dlmalloc[=LIB]
在 一些系統上,內建的記憶體分配機制(malloc)在使用squid 時表現不盡人意。使用--enable-dlmalloc 選項將squid 原始程式碼包中的dlmalloc 包編譯和連結進來。假如你的系統中已安裝dlmalloc,你能使用=LIB 參數指定庫的路徑。請見http://g.oswego.edu/dl/html/malloc.html更多關於dlmalloc 的資訊。

--enable-gnuregex
在 存取控制清單和其他配置指令裡,squid 使用規則運算式作為匹配機制。GNU 的規則運算式庫包含在squid 的原始程式碼包裡;它可以在沒有內建規則運算式的作業系統中使用。./configure腳本偵察你系統中的規則運算式庫,假如必要,它可以啟動使用GNU正 則運算式。如果因為某些理由,你想強制使用GNU規則運算式,你可以將這個選項加到./configure命令後。

--enable-carp
Cache陣列路由式通訊協定(CARP)用來轉發丟失的cache到父cache的陣列或cluster。在10.9章有更多關於CARP的細節。

--enable-async-io[=N_THREADS]
同 步I/O 是squid 技術之一,用以提升存儲性能。aufs 模組使用大量的執行緒來執行磁片I/O 操作。該代碼僅僅工作在linux 和solaris 系統中。=N_THREADS 參數改變squid 使用的執行緒數量。aufs 和同步I/O 在8.4 章中被討論。
請注意--enable-async-io 是打開其他三個./configure 選項的快捷方式,它等同於:
--with-aufs-threads=N_THREADS
--with-pthreads
--enable-storeio=ufs,aufs
--with-pthreads

該選項導致編譯過程連結到你系統中的P 執行緒庫。aufs 存儲模組是squid 中唯一需要使用執行緒的部分。通常來說,如果你使用--enable-saync-io 選項,那麼不必再單獨指定該選項,因為它被自動啟動了。

--enable-storeio=LIST
Squid 支援大量的不同存儲模組。通過使用該選項,你告訴squid 編譯時使用哪個模組。在squid-2.5 中,支持ufs,aufs,diskd,和null 模組。通過查詢src/fs 中的目錄,你能得到一個模組清單。LIST 是一個以逗號分隔的模組清單,例如:
% ./configure --enable-storeio=afus,diskd,ufs

ufs 模組是預設的,看起來問題最少。不幸的是,它性能有限。其他模組可能在某些作業系統中不必編譯。關於squid 存儲模組的完整描述,請見第8章。

--with-aufs-threads=N_THREADS
指定aufs 存儲機制使用的執行緒數量(見8.4章)。squid 預設根據緩存目錄的數量,自動計算需要使用多少執行緒。

--enable-heap-replacement
該選項不再使用,但被保留用於向後相容性。你該使用--enable-removal-policies 來代替。

--enable-removal-policies=LIST
排除策略是squid 需要騰出空間給新的cache目標時,用以排除舊目標的機制。squid-2.5支援3個排除策略:最少近期使用(LRU),貪婪對偶大小(GDS),最少經常使用(LFU)。

然而,因為一些理由,./configure 選項使指定的替代策略和需要執行它們的基本資料結構之間的差別模糊化。LRU是預設的,它以雙鏈表資料結構執行。GDS和LFU使用堆疊的資料結構。

為了使用GDS 或LFU 策略,你指定:
% ./configure --enable-removal-policies=heap

然後你在squid 的設定檔裡選擇使用GDS或LFU。假如你想重新使用LRU,那麼指定:
% ./configure --enable-removal-policies=heap,lru
更多的關於替換策略的細節請見7.5 章。

--enable-icmp
如在10.5 章中描述的一樣,squid 能利用ICMP消息來確定回環時間尺寸,非常象ping程式。你能使用該選項來啟動這些功能。

--enable-delay-pools
延時池是squid 用於傳輸形狀或頻寬限制的技術。該池由大量的用戶端IP 位址組成。當來自這些用戶端的請求處於cache 丟失狀態,他們的回應可能被人工延遲。關於延時池的更多細節請見附錄C。

--enable-useragent-log
該選項啟動來自客戶請求的HTTP 使用者代理頭的日誌。更多細節請見13.5 章。

--enable-referer-log
該選項啟動來自客戶請求的HTTP referer 日誌。更多細節請見13.4 章。

--disable-wccp
Web cache 協調協議(WCCP)是CISCO 的專有協議,用於阻止或分發HTTP 請求到一個或多個caches。WCCP默認被啟動,假如你願意,可以使用該選項來禁止該功能。

摘自:http://www.91linux.com/html/article/guanli/20081213/14672.html

沒有留言:

wibiya widget