在運行程序時,程序代碼本身沒有出錯,但是還是報了一個 too many open files,經(jīng)過查找后發(fā)現(xiàn)是linux系統(tǒng)本身對進程可以打開的文件有一個數(shù)量的限制。下面是解決方法
一 ulimit命令
Linux對于每個用戶,系統(tǒng)限制其最大進程數(shù)。為提高性能,可以根據(jù)設(shè)備資源情況,設(shè)置各linux 用戶的最大進程數(shù)。
參數(shù)
-a:顯示目前資源限制的設(shè)定;
-c :設(shè)定core文件的最大值,單位為區(qū)塊;
-d <數(shù)據(jù)節(jié)區(qū)大小>:程序數(shù)據(jù)節(jié)區(qū)的最大值,單位為KB;
-f <文件大小>:shell所能建立的最大文件,單位為區(qū)塊;
-H:設(shè)定資源的硬性限制,也就是管理員所設(shè)下的限制;
-m <內(nèi)存大小>:指定可使用內(nèi)存的上限,單位為KB;
-n <文件數(shù)目>:指定同一時間最多可開啟的文件數(shù);
-p <緩沖區(qū)大小>:指定管道緩沖區(qū)的大小,單位512字節(jié);
-s <堆疊大小>:指定堆疊的上限,單位為KB;
-S:設(shè)定資源的彈性限制;
-t :指定CPU使用時間的上限,單位為秒;
-u <程序數(shù)目>:用戶最多可開啟的程序數(shù)目;
-v <虛擬內(nèi)存大小>:指定可使用的虛擬內(nèi)存上限,單位為KB。
所以我們可以通過ulimit -n查看到當(dāng)前shell里最多可開啟的文件數(shù)。一般默認是1024.
很明顯,在生產(chǎn)環(huán)境中,這個默認值是會慢慢超過的,也就產(chǎn)生了too many open files這個問題,現(xiàn)在我們需要去修改這個參數(shù)。
1.臨時方法 shell級限制
ulimit -n xxx
這種方式可以在本次連接中有效,下次重新登錄服務(wù)器時就會失效
2.長久方法 用戶級限制
通過修改 /etc/security/limits.conf實現(xiàn)
vi /etc/security/limits.conf
在文件末尾添加:
* soft nofile 4096
* hard nofile 4096
這里添加了兩行四列,分別對應(yīng)下面四個參數(shù)說明:
username|@groupname type resource limit
用戶 類型 資源 限制
所以,在文件末尾添加的兩句命令就是:
任何用戶 軟件 任何文件 4096個文件
任何用戶 硬件 任何文件 4096個文件
修改完畢后,直接退出本次服務(wù)器連接 ,重新登錄一下就可,不必重啟服務(wù)器。
二 補充:
1./proc/sys/fs/file-max限制不了/etc/security/limits.conf
2.只有root用戶才有權(quán)限修改/etc/security/limits.conf
3.對于非root用戶, /etc/security/limits.conf會限制ulimit -n,但是限制不了root用戶
4.對于非root用戶,ulimit -n只能越設(shè)置越小,root用戶則無限制
5.任何用戶對ulimit -n的修改只在當(dāng)前環(huán)境有效,退出后失效,重新登錄新來后,ulimit -n由limits.conf決定
6.如果limits.conf沒有做設(shè)定,則默認值是1024
7.當(dāng)前環(huán)境的用戶所有進程能打開的最大問價數(shù)量由ulimit -n決定