在公司服务器上切换用户,出现 "-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来查询。