1. 程式人生 > >linux 如何設定程序所能開啟的最大檔案描述符個數

linux 如何設定程序所能開啟的最大檔案描述符個數

當某個程式開啟檔案時,作業系統返回相應的檔案描述符,程式為了處理該檔案必須引用此描述符。所謂的檔案描述符是一個低階的正整數。最前面的三個檔案描述符(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,那是一個放置這些命令的好地方。
補充: 
  
檔案描述符
是個很小的正整數,它是一個索引值,指向核心為每一個程序所維護的該程序開啟檔案的記錄表。 
  檔案描述符的優點:相容POSIX標準,許多
Linux

UNIX
系統呼叫都依賴於它。
  檔案描述符的缺點:不能移植到UNIX以外的系統上去,也不直觀。
    基於檔案描述符的輸入輸出函式:
  open:開啟一個檔案,並指定訪問該檔案的方式,呼叫成功後返回一個檔案描述符。
  creat:開啟一個檔案,如果該檔案不存在,則建立它,呼叫成功後返回一個檔案描述符。
  close:關閉檔案,程序對檔案所加的鎖全都被釋放。
  read:從檔案描述符對應的檔案中讀取資料,呼叫成功後返回讀出的位元組數。
  write:向檔案描述符對應的檔案中寫入資料,呼叫成功後返回寫入的位元組數。
  ftruncate:把檔案描述符對應的檔案縮短到指定的長度,呼叫成功後返回0。
  lseek:在檔案描述符對應的檔案裡把檔案指標設定到指定的位置,呼叫成功後返回新指標的位置。
  fsync:將所有已寫入檔案中的資料真正寫到磁碟或其他下層裝置上,呼叫成功後返回0。
  fstat:返回檔案描述符對應的檔案的相關資訊,把結果儲存在struct stat中,呼叫成功後返回0。
  fchown:改變與開啟檔案相關聯的所有者和所有組,呼叫成功後返回0。
  fchmod:把檔案描述符對應的檔案的許可權位改為指定的八進位制模式,呼叫成功後返回0。
  flock:用於向檔案描述符對應的檔案施加建議性鎖,呼叫成功後返回0。
  fcntl:既能施加建議性鎖也能施加強制性鎖,能建立記錄鎖、讀取鎖和寫入鎖,呼叫成功後返回0。
  dup:複製檔案描述符,返回沒使用的檔案描述符中最小的編號。
  dup2:由使用者指定返回的檔案描述符的值,用來重新開啟或重定向一個檔案描述符。
  select:同時從多個檔案描述符讀取資料或向多個檔案描述符寫入資料