在公司服務器上切換用戶,出現 "-bash: fork: retry: Resource temporarily unavailable"這樣的報錯,查詢得知是普通用戶能夠使用的進程數太少和文件描述符太小導致的,每一個文件描述符會和一個文件對應,但是很多文件描述符也會和一個文件對應。相同的文件可以被不同的進程打開,也可以被同一個進程打開多次。我們可以從系統層面和進程層面來查看相應的文件描述符。
一,系統層面的文件描述符
涉及到系統層面的,基本上都是通過修改內核參數來實現的,修改系統中的文件描述符可以通過下面兩種方式來實現:
1,/proc/sys/fs/file-max,這個裏面記錄了系統中可以打開的文件描述符最大有多少個,我們可以使用cat查看下總數有多少個,如果不夠了echo進更大的數,一般情況下不用動的。
cat /proc/sys/fs/file-max
2,方法1是臨時性的更改,系統重啓後參數就會失效,因此需要寫入文件中保存起來,Linux下修改的內核參數,修改的文件都是在/etc/sysctl.conf文件中,我們需要寫入下面內容:
fs.file-max=xxxx
然後使用sysctl -p 命令來生效。
除此以外我們還可以通過/proc/sys/fs/file-nr參數來查看系統中文件描述符。
cat /proc/sys/fs/file-nr
2272 0 100000
2272 : 表示當前系統已分配使用了多少文件描述符
0 : 表示當前系統分配了2272個文件描述符,有多少個是沒有使用的。
100000 : 表示系統中文件描述符總的個數
二,進程層面的文件描述符
進程層面的文件描述符可以通過ulimit命令來表示,也可以通過配置文件生效,可以通過這兩種方法來生效:
1,ulimit -u 表示單個用戶可以使用的最大的進程數
ulimit -n 表示可打開的文件描述符的最大個數
修改文件描述符可以通過這個命令:
ulimit -SHn xxxxxx ,其中S表示"soft",表示軟限制,是可以超過這個限制,H表示"hard",表示硬限制,是不能超過這個限制的。
2 , 同樣方法1是臨時性的,永久有效的話,必須寫入配置文件中,文件描述符中配置文件路徑在/etc/security/limits.conf 寫入
* soft nofile 32768 可以打開的文件描述符最大數(軟限制)
* hard nofile 65536 可以打開的文件描述符最大數(硬鏈接)
* soft nproc 32768 單個用戶可以使用的最大進程數(軟限制)
* hard nproc 65536 單個用戶可以使用的最大進程數(硬限制)
或者可以在/etc/security/limits.d/xxx-nproc.conf(若不存在則創建)寫入
* soft nproc 32768
* hard nproc 65536
在/etc/security/limits.d/xxx-nofile.conf(若不存在則創建)寫入
* soft nofile 32768
* hard nofile 65536
其中的第一列表示domain域,可以給沒某個用戶限制,或者某個用戶組限制,*表示對所有的用戶限制,但是root用戶除外,root用戶不受限制。具體的使用,可以使用man limits.conf來查詢。