1. 程式人生 > >linux對檔案描述符的種種限制

linux對檔案描述符的種種限制

最近在研究linux伺服器下TCP的最大連線數問題,因為系統為每個TCP連線都要建立一個socket控制代碼,而每個socket控制代碼同時也是一個檔案控制代碼,所以就專門對linux下檔案描述符的種種限制作了一些深入的研究:

1,ulimit  -n 65556

ulimit -n是用來檢視使用者單一程序可同時開啟的最大檔案數,預設情況下是1024,我們通過ulimit -n 65536,將最大檔案數修改為65536,此修改只對當前會話有效。

當然,ulimit還有其他的用法,比如ulimit -a就能夠顯示系統資源的各種限制,這裡就不再繼續講解,有興趣的童鞋可以繼續深入挖掘下~

2,/etc/security/limits.conf

看其所在資料夾和檔名字我們也可以猜到,這個是為了linux的效能、安全而設計的一些限制,那麼如果我們要修改最大可開啟的檔案控制代碼數,我們可以在limits.conf在增加如下程式碼:

* soft nofile 65536

* hard nofile 65536

這裡面會有幾個概念,比如nofile引數、軟限制與硬限制等等,大家也可以自己繼續挖掘下。

3,cat proc/sys/fs/file-max:

核心引數:linux核心將分配的最大的檔案控制代碼數,所有程序一共可以開啟的檔案數量。

還有一個是:cat /proc/sys/fs/file-nr: 5728  0  61763

                     第一個引數:代表已分配的檔案控制代碼
                     第二個引數:代表已使用的檔案控制代碼
                    第三個引數:代表檔案控制代碼的最大值

為了繼續尋找檔案限制的相關證據,我又進行了深入的挖掘,在深入理解linux核心的第三版中有這樣一些描述:

The files_init() function, executed during kernel initialization, sets the max_files to one-tenth of the available RAM in kilobytes, bute the system administrator can tune this parameter by writing into the /proc/sys/fs/file-max file.

上面這段即是:
記憶體初始化期間,files_init()函式把max_files欄位設定為可用RAM大小的1/10(kilobytes),不過,系統管理員可以通過寫/proc/sys/fs/file-max檔案來修改這個值。

而能改到多大,就沒有這個說法了。

而在linux核心原始碼:files_init()內則有:
 /*
  * One file with associated inode and dcache is very roughly 1K.
  * Per default don't use more than 10% of our memory for files.
  */

 n = (mempages * (PAGE_SIZE / 1024)) / 10;
 files_stat.max_files = n;
通過上面的一段描述:我們知道,帶inode和dcache的一個檔案大概就是1K(bit),而我們接收到的建議是檔案的使用不超過10%的記憶體使用量。

總結:linux的最大可開啟檔案數是可修改的,但具體能修改到多大,這要看機器的記憶體情況了。按照這個說法,tcp的連線數限制條件中的檔案開啟數,我們就可以通過修改檔案限制引數和擴充套件記憶體來增加。至於tcp連線數的其他限制條件,則要在之後繼續研究了。

引用文章: