原創文章,轉載請注明出處:http://jameswxx.iteye.com/blog/2096461
寫這個文章是為了以正視聽,網上的文章人雲亦雲到簡直令人發指。到底最大檔案數被什麼限制了?too many open files錯誤到底可以通過什麼參數控制?網上的很多文章說的大緻步驟是沒有錯的,大緻如下:
shell級限制
通過ulimit -n修改,如執行指令ulimit -n 1000,則表示将目前shell的目前使用者所有程序能打開的最大檔案數量設定為1000.
使用者級限制
ulimit -n是設定目前shell的目前使用者所有程序能打開的最大檔案數量,但是一個使用者可能會同時通過多個shell連接配接到系統,是以還有一個針對使用者的限制,通過修改 /etc/security/limits.conf實作,例如,往limits.conf輸入以下内容:
root soft nofile 1000
root hard nofile 1200
soft nofile表示軟限制,hard nofile表示硬限制,軟限制要小于等于硬限制。上面兩行語句表示,root使用者的軟限制為1000,硬限制為1200,即表示root使用者能打開的最大檔案數量為1000,不管它開啟多少個shell。
系統級限制
修改cat /proc/sys/fs/file-max
但是呢,有很多很重要的細節,有很多錯誤的描述,一塌糊塗,是以特的在這裡做一個說明。
一 ulimit -n
網上很多人說,ulimit -n限制使用者單個程序的問價打開最大數量。嚴格來說,這個說法其實是錯誤的。看看ulimit官方描述:
Provides control over the resources available to the shell and to processes started by it, on systems that allow such control. The -H and -S options specify that the hard or soft limit is set for the given resource. A hard limit cannot be increased once it is set; a soft limit may be increased up to the value of the hard limit. If neither -H nor -S is specified, both the soft and hard limits are set. The value of limit can be a number in the unit specified for the resource or one of the special values hard, soft, or unlimited, which stand for the current hard limit, the current soft limit, and no limit, respectively.
If limit is omitted, the current value of the soft limit of the resource is printed, unless the -H option is given. When more than one resource is specified, the limit name and unit are printed before the value.
人家從來就沒說過是限制使用者的單個程序的最大檔案打開數量,看看紅色部分,是限制目前shell以及該shell啟動的程序打開的檔案數量。為什麼會給人限制單個線程的最大檔案數量的錯覺,因為很多情況下,在一個shell環境裡,雖然可能會有多個程序,但是非常耗費檔案句柄的程序不會很多,隻是其中某個程序非常耗費檔案句柄,比如伺服器上運作着一個tomcat,那麼就是java程序要占用大多數檔案句柄。此時ulimit設定的最大檔案數和java程序耗費的最大檔案數基本是對應的,是以會給人這樣的一個錯覺。
還有,很多文章稱ulimit -n 隻允許設定得越來越小,比如先執行了ulimit -n 1000,在執行ulimit -n 1001,就會報"cannot modify limit: Operation not permitted"錯誤。這個其實也是不準确的說法。首先要搞清楚,任何使用者都可以執行ulimit,但root使用者和非root使用者是非常不一樣的。
非root使用者隻能越設定越小,不能越設定越大
我在機器上以非root先執行:
[wxx@br162 etc]$ ulimit -n 900
[wxx@br162 etc]$
執行成功,再增大:
[wxx@br162 etc]$ ulimit -n 901
-bash: ulimit: open files: cannot modify limit: Operation not permitted
[wxx@br162 etc]$
增加失敗,如果減少則是OK的:
[wxx@br162 etc]$ ulimit -n 899
[wxx@br162 etc]$
如果再增加到900是不行的:
[wxx@br162 etc]$ ulimit -n 900
-bash: ulimit: open files: cannot modify limit: Operation not permitted
[wxx@br162 etc]$
root使用者不受限制
首先切換到root:
[wxx@br162 etc]$ sudo su -
[root@br162 ~]#
檢視下目前限制:
[root@br162 ~]# ulimit -n
1000000
[root@br162 ~]#
增大:
[root@br162 ~]# ulimit -n 1000001
[root@br162 ~]#
可以成功增大,再減小:
[root@br162 ~]# ulimit -n 999999
[root@br162 ~]#
減小也是成功的,再增大:
[root@br162 ~]# ulimit -n 1000002
[root@br162 ~]#
也是ok的,可見root是不受限制的。
ulimit裡的最大檔案打開數量的預設值
如果在limits.conf裡沒有設定,則預設值是1024,如果limits.con有設定,則預設值以limits.conf為準。例如我換了一台機器,登入進去,ulimit -n顯示如下:
[root@zk203 ~]# ulimit -n
2000
這是因為我的limits.conf裡的檔案打開數是2000,如下:
[root@zk203 ~]# cat /etc/security/limits.conf
root soft nofile 2000
root hard nofile 2001
如果limits.conf裡不做任何限制,則重新登入進來後,ulimit -n顯示為1024。
[root@zk203 ~]# ulimit -n
1024
ulimit修改後生效周期
修改後立即生效,重新登入進來後失效,因為被重置為limits.conf裡的設定值
二 /etc/security/limits.conf
網上還有缪傳,ulimit -n設定的值不能超過limits.conf裡設定的檔案打開數(即soft nofile)
好吧,其實這要分兩種情況,root使用者是可以超過的,比如目前limits.conf設定如下:
root soft nofile 2000
root hard nofile 2001
但是我用root将最大檔案數設定到5000是成功的:
[root@zk203 ~]# ulimit -n 5000
[root@zk203 ~]# ulimit -n
5000
[root@zk203 ~]#
但是非root使用者是不能超出limits.conf的設定,我切換到wxx,執行指令如下:
[wxx@zk203 ~]# ulimit -n 5000
-bash: ulimit: open files: cannot modify limit: Operation not permitted
[wxx@zk203 etc]$
是以網上的說法是錯誤的,即使非root使用者的最大檔案數設定不能超過limits.conf的設定,這也隻是一個表象,實際上是因為,每個使用者登入進來,ulimit -n的預設值是limits.conf的 soft nofile指定的,但是對于非root使用者,ulimit -n隻能越來越小,不能越來越大,其實這個才是真正的原因,但是結果是一樣的。
修改了limits.conf需要重新開機系統?
這個說法非常搞笑,修改了limits.conf,重新登入進來就生效了。在機器上試試就知道了,好多人真的很懶,甯願到處問也不願意花一分鐘時間實際操作一下。
三 /proc/sys/fs/file-max
網上說,ulimit -n 和limits.conf裡最大檔案數設定不能超過/proc/sys/fs/file-max的值,這也是搞笑了,/proc/sys/fs/file-max是系統給出的建議值,系統會計算資源給出一個和合理值,一般跟記憶體有關系,記憶體越大,改值越大,但是僅僅是一個建議值,limits.conf的設定完全可以超過/proc/sys/fs/file-max。
[root@zk203 ~]# cat /proc/sys/fs/file-max
1610495
我将limits.conf裡檔案最大數量設定為1610496,儲存後,列印出來:
[root@zk203 ~]# cat /etc/security/limits.conf
root soft nofile1610496
root hard nofile1610496
四 總結一下
- /proc/sys/fs/file-max限制不了/etc/security/limits.conf
- 隻有root使用者才有權限修改/etc/security/limits.conf
- 對于非root使用者, /etc/security/limits.conf會限制ulimit -n,但是限制不了root使用者
- 對于非root使用者,ulimit -n隻能越設定越小,root使用者則無限制
- 任何使用者對ulimit -n的修改隻在目前環境有效,退出後失效,重新登入新來後,ulimit -n由limits.conf決定
- 如果limits.conf沒有做設定,則預設值是1024
- 目前環境的使用者所有程序能打開的最大問價數量由ulimit -n決定