文件描述符介紹

當某個程序打開文件時,操作系統返回相應的文件描述符,程序爲了處理該文件必須引用此描述符。所謂的文件描述符是一個低級的正整數。最前面的三個文件描述符(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

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

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1560102

from:http://ciwnet.blog.sohu.com/47822540.html




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章