Unix下檔案描述符與Squid

2021-04-16 19:03:36 字數 1709 閱讀 2369

檔案描述符是乙個簡單的整數,用以標明每乙個被程序所開啟的檔案和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 unlimited

sh$ ulimit -n

4096

在freebsd上,你能使用sysctl命令:

% sysctl -a | grep maxfiles

kern.maxfiles: 8192

kern.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

#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
然後,重啟機器以使改動生效。

Linux 下檔案描述符(二)

程式設計中應該使用中定義的stdin fileno stdout fineno stderr fileno 三個巨集來表示0,1,2.在程式中可以使用close來關閉stdout fineno 標準輸出 然後再使用open系統呼叫開啟裝置或者檔案,則其對應的檔案描述符則為1,此時系統就會將其作為標準...

mysql 檔案描述符 檔案描述符

toc 首先,linux的世界裡一切皆為檔案,無論是裝置還是乙個socket連線。檔案又可分為 普通檔案 目錄檔案 鏈結檔案和裝置檔案。檔案描述符 file descriptor 是核心為了高效管理已被開啟的檔案所建立的索引,其是乙個非負整數 通常是小整數 用於指代被開啟的檔案,所有執行i o操作的...

linux下檔案描述符的介紹

當某個程式開啟檔案時,作業系統返回相應的檔案描述符,程式為了處理該檔案必須引用此描述符。所謂的檔案描述符是乙個低階的正整數。最前面的三個檔案描述符 0,1,2 分別與標準輸入 stdin 標準輸出 stdout 和標準錯誤 stderr 對應。因此,函式 scanf 使用 stdin,而函式 pri...