注册

Linux报 “too many files open in system” 异常的原因以及解决办法

问题描述:

在Linux系统中,当打开文件过多时,可能会出现 too many files open in system 的错误提示,这是由于系统打开的文件描述符数目达到了系统设定的最大值,导致无法再打开新文件而出现的错误。当出现这种问题时,需及时处理,否则可能会影响系统的正常运转。

原因分析:

在Linux系统中,每个进程都有一个打开文件描述符的限制,而这个限制值默认是1024,即单个进程可以同时打开的文件数的最大值。当文件数达到这个值时,系统便会报 too many files open in system 的错误。出现此问题,常见原因有以下几种:

  1. 系统资源不足,进程所占用的文件描述符数太多。

  2. 进程代码存在漏洞,导致产生大量未关闭的文件描述符。

  3. 同一时间内并发连接数过多,例如Nginx服务器,超过一定数量的并发连接会导致文件描述符用光。

解决方法:

对于这种问题,我们可以采取以下一些方法来解决。

  1. 修改 Linux 系统句柄限制

可以通过ulimit命令修改进程打开文件数的限制,临时提升当前shell的句柄限制,紧急处理当前问题。执行以下两条命令即可:

ulimit -n 65535
echo "* soft nofile 65535" >> /etc/security/limits.conf

在这种修改方式下,系统每次启动时都会设置上述的数值限制。

  1. 关闭不必要的文件描述符

查看当前系统下每个进程的打开文件描述符数,使用lsof命令。

lsof -p pid | wc -l                       #查看当前进程pid的句柄数
lsof -u user | wc -l                      #查看用户user的文件数
lsof -i:port                              #查看port端口号的文件数
lsof | awk '{print $2}' | sort | uniq -c | sort -rn | head    #查看进程打开文件数最多的前5个进程

然后可以根据lsof的输出信息,关闭没有用的文件描述符,例如关闭掉不需要的文件描述符。

exec 2>&-                                #关闭文件描述符2
  1. 修改进程代码中的漏洞

如果是进程代码中存在漏洞导致产生过多的未关闭文件描述符,需要对进程代码进行修改。

  1. 如果是同一时间内并发连接数过多导致的问题则需要调整相应的系统参数,例如增加进程描述符限制,增加监听队列长度等。

总结:

以上是针对Linux系统报 too many files open in system 的原因与解决办法进行的详细讲解,可以根据具体问题情况选择相应的解决办法,处理好文中提到的各类问题,从而达到解决问题、提高系统运行效率的目的。