问题
bash: fork: retry resource temporarily unavailable 的报错
原因
用户能够使用的进程数太少和文件描述符太小导致,每一个文件描述符会和一个文件对应,但是很多文件描述符也会和一个文件对应。相同的文件可以被不同的进程打开,也可以被同一个进程打开多次。
方案
一,系统层面的文件描述符
涉及到系统层面的,基本上都是通过修改内核参数来实现的,修改系统中的文件描述符可以通过下面两种方式来实现:
1,/proc/sys/fs/file-max,这个里面记录了系统中可以打开的文件描述符最大有多少个,我们可以使用cat查看下总数有多少个,如果不够了echo进更大的数,一般情况下不用动的。
cat /proc/sys/fs/file-max
方法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
二,进程层面的文件描述符
进程层面的文件描述符可以通过ulimit命令来表示,也可以通过配置文件生效,可以通过这两种方法来生效:
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(若不存在则创建)写入
bash * 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来查询。
|