檔案描述符是一個簡單的整數,用以標明每一個被進程所開啟的檔案和socket。第一個開啟的檔案是0,第二個是1,依此類推。Unix作業系統通常給每個進程能開啟的檔案數量強加一個限制。更甚的是,unix通常有一個系統級的限制。
因為squid的工作方式,檔案描述符的限制可能會極大的影響效能。當squid用完所有的檔案描述符後,它不能接收使用者新的串連。也就是說,用完檔案描述符導致拒絕服務。直到一部分當前請求完成,相應的檔案和socket被關閉,squid不能接收新請求。當squid發現檔案描述符短缺時,它會發布警告。
在運行./configure之前,檢查你的系統的檔案描述符限制是否合適,能給你避免一些麻煩。大多數情況下,1024個檔案描述符足夠了。非常忙的cache可能需要4096或更多。在設定檔描述符限制時,我推薦設定系統級限制的數量為每個進程限制的2倍。
通常在你的Unix shell中能找到系統的檔案描述符限制。所有的C shell及其類似的shell有內建的limit命令。更新的Bourne shell及其類似的shell有一條叫做ulimit的命令。為了發現你的系統的檔案描述符限制,試運行如下命令:
csh% limit descriptors unlimited csh% limit descriptors descriptors 4096
或者
sh$ ulimit -n unlimitedsh$ ulimit -n4096
在Freebsd上,你能使用sysctl命令:
% sysctl -a | grep maxfileskern.maxfiles: 8192kern.maxfilesperproc: 4096
如果你不能確認檔案描述符限制,squid的./configure指令碼能替你做到。當你運行./configure時,請見3.4章節,觀察末尾這樣的輸出:
checking Maximum number of file descriptors we can open... 4096
假如其他的limit,ulimit,或者./configure報告這個值少於1024,你不得不在編譯squid之前,花費時間來增加這個限制值的大小。否則,squid在高負載時執行效能將很低。
增加檔案描述符限制的方法因系統不同而不同。下面的章節提供一些方法協助你開始。
3.3.1.1 Freebsd,NetBSD,OpenBSD
編輯你的核心設定檔,增加如下一行:
options MAXFILES=8192
在OpenBSD上,使用option代替options。然後,configure,編譯,和安裝新核心。最後重啟系統以使核心生效。
3.3.1.2 Linux
在Linux上設定檔描述符有點複雜。在編譯squid之前,你必須編輯系統include檔案中的一個,然後執行一些shell命令。請首先編輯/usr/include/bits/types.h檔案,改變_ _FD_SETSIZE 的值:
#define _ _FD_SETSIZE 8192
下一步,使用這個命令增加核心檔案描述符的限制:
# echo 8192 > /proc/sys/fs/file-max
最後,增加進程檔案描述符的限制,在你即將編譯squid的同一個shell裡執行:
sh# ulimit -Hn 8192
該命令必須以root運行,僅僅運行在bash shell。不必重啟機器。使用這個技術,你必須在每一次系統啟動後執行上述echo和ulimit命令,或者至少在squid啟動之前。假如你使用某個rc.d指令碼來啟動squid,那是一個放置這些命令的好地方。
3.3.1.3 Solaris
增加該行到你的/etc/system檔案:
set rlim_fd_max = 4096
然後,重啟機器以使改動生效。