问题场景:linux系统出现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命令来表示,也可以通过配置文件生效,可以通过这两种方法来生效:

  1ulimit -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来查询。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐