linux下設置最大文件打開數nofile及nr_open、file-max說明

在開發運維的時候咱們經常會遇到相似「Socket/File: Can’t open so many files」,「沒法打開更多進程」,或是coredump過大等問題,這些均可以設置資源限制來解決。今天在教某位客戶設置最大文件數方法時,搜索網上的方法時發現各家說法並不一致,便寫了這篇文檔。linux

 

一般對linux某個用戶設置系統資源,咱們都已經知道能夠用ulimit命令來查看和設置。windows

表 1. ulimit 參數說明bash

選項 [options] 含義 例子
-H 設置硬資源限制,一旦設置不能增長。 ulimit – Hs 64;限制硬資源,線程棧大小爲 64K。
-S 設置軟資源限制,設置後能夠增長,可是不能超過硬資源設置。 ulimit – Sn 32;限制軟資源,32 個文件描述符。
-a 顯示當前全部的 limit 信息。 ulimit – a;顯示當前全部的 limit 信息。
-c 最大的 core 文件的大小, 以 blocks 爲單位。 ulimit – c unlimited; 對生成的 core 文件的大小不進行限制。
-d 進程最大的數據段的大小,以 Kbytes 爲單位。 ulimit -d unlimited;對進程的數據段大小不進行限制。
-f 進程能夠建立文件的最大值,以 blocks 爲單位。 ulimit – f 2048;限制進程能夠建立的最大文件大小爲 2048 blocks。
-l 最大可加鎖內存大小,以 Kbytes 爲單位。 ulimit – l 32;限制最大可加鎖內存大小爲 32 Kbytes。
-m 最大內存大小,以 Kbytes 爲單位。 ulimit – m unlimited;對最大內存不進行限制。
-n 能夠打開最大文件描述符的數量。 ulimit – n 128;限制最大可使用 128 個文件描述符。
-p 管道緩衝區的大小,以 Kbytes 爲單位。 ulimit – p 512;限制管道緩衝區的大小爲 512 Kbytes。
-s 線程棧大小,以 Kbytes 爲單位。 ulimit – s 512;限制線程棧的大小爲 512 Kbytes。
-t 最大的 CPU 佔用時間,以秒爲單位。 ulimit – t unlimited;對最大的 CPU 佔用時間不進行限制。
-u 用戶最大可用的進程數。 ulimit – u 64;限制用戶最多可使用 64 個進程。
-v 進程最大可用的虛擬內存,以 Kbytes 爲單位。 ulimit – v 200000;限制最大可用的虛擬內存爲 200000 Kbytes。

固然咱們都知道linux大部分的命令設置都是臨時生效,並且ulimit命令只對當前終端生效,若是須要永久生效的話,咱們有兩種方法,一種是將命令寫至profile和bashrc中,在有些網頁中說寫到rc.local,實際上是不對的;還有一種就是在limits.conf中添加記錄(需重啓生效,而且在/etc/pam.d/中的seesion有使用到limit模塊)。接下來討論的就是在limits.conf用戶最大文件打開數限制的相關內容。運維

 

針對用戶打開最大文件數的限制, 在limits.conf對應的nofile,不論是man手冊仍是文件中說明都只是一句話「maximum number of open files",它其實對應是單個進程能打開的最大文件數,一般爲了省事,咱們想取消它的限制,根據man手冊中,「values -1, unlimited or infinity indicating no limit」,-一、unlimited、infinity都是代表不作限制,但是當你實際給nofile設置成這個值,等你重啓就會發現沒法登陸系統了。函數

 

因而可知,nofile是有一個上限的,同時用ulimit測試:測試

 

#ulimit -n unlimitedthis

bash: ulimit: open files: cannot modify limit: 不容許的操做google

 

寫一個簡單的for循環得出:spa

1線程

#for  V in `seq  100000  10000000`;do ulimit -n $V;[[ $? != 0 ]]&&break;done

 

再執行ulimit -n ,能夠看到1048576就是nofile的最大值了,但爲何是這個值?1048576是1024*1024,固然這並無什麼卵用。。。再跟蹤一下咱們就會發現這個值實際上是由內核參數nr_open定義的: 

 

# cat /proc/sys/fs/nr_open 

1048576

 

到此咱們就要提及nr_open,與file-max了,網上在說到設置最大文件數時偶爾有些帖子也說到要修改file-max,字面上看file-max確實像是對應最大文件數,而在linux內核文檔中它們兩的解釋是:

file-max:

The value in file-max denotes the maximum number of file-

handles that the Linux kernel will allocate. When you get lots

of error messages about running out of file handles, you might

want to increase this limit

 

執行:grep -r MemTotal /proc/meminfo | awk '{printf("%d",$2/10)}',能夠看到與file-max是相近的;

nr_open:

This denotes the maximum number of file-handles a process can

allocate. Default value is 1024*1024 (1048576) which should be

enough for most machines. Actual limit depends on RLIMIT_NOFILE

resource limit.

 

額,到此筆者有點暈了,file-handles(即文件句柄),而後相比而言在UNIX/LINUX中咱們接觸更可能是file discriptor(FD,即文件描述符),經過百度搜索,彷佛file-handle在windows中是一個相似file discrptor的東東,可是咱們討論的是linux,再google一下,咱們能夠精確到c語言中這兩個概念的區別,據他們的討論file-handle應該是一個高層的對象,使用fopen,fread等函數來調用,而FD是底層的一個對象,能夠經過open,read等函數來調用。

 

到此,咱們應該能夠下一個大體的結論了,file-max是內核可分配的最大文件數,nr_open是單個進程可分配的最大文件數,因此在咱們使用ulimit或limits.conf來設置時,若是要超過默認的1048576值時須要先增大nr_open值(sysctl -w fs.nr_open=100000000或者直接寫入sysctl.conf文件)。固然百萬級別的單進程最大file-handle打開數應該也夠用了吧。。

 

因爲筆者水平有限,內容不免有錯漏之處,還有file-max的默認值爲什麼會比nr_open值要小也沒有再深刻追究,歡迎你們來討論交流。

相關文章
相關標籤/搜索