天天看點

什麼是檔案描述符

當某個程式打開檔案時,作業系統傳回相應的檔案描述符,程式為了處理該檔案必須引用此描述符。所謂的檔案描述符是一個低級的正整數。最前面的三個檔案描述符(0,1,2)分别與标準輸入(stdin),标準輸出(stdout)和标準錯誤(stderr)對應。是以,函數 scanf() 使用 stdin,而函數 printf() 使用 stdout。你可以用不同的檔案描述符改寫預設的設定并重定向程序的 I/O 到不同的檔案。

1、首先說什麼是檔案描述符,它有什麼作用?

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

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

在運作./configure 之前,檢查你的系統的檔案描述符限制是否合适,能給你避免一些麻煩。大多數情況下,1024 個檔案描述符足夠了。非常忙的cache可能需要4096或更多。在配置檔案描述符限制時,我推薦設定系統級限制的數量為每個程序限制的2 倍。

2、怎麼突破,具體方法?

先檢視LINUX預設的檔案描述符:

# ulimit -n

1024

我們用指令

ulimit -HSn 65536

來增大檔案描述符,然後編譯安裝squid,

把ulimit -HSn 65536放到/etc/rc.d/rc.local讓啟動時加載。

以下為轉載:

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,那是一個放置這些指令的好地方。

本文轉自 ibelieveme 51CTO部落格,原文連結:http://blog.51cto.com/skyson/541388,如需轉載請自行聯系原作者

繼續閱讀