修复 Linux 中的“打开文件过多”错误


摘要

在负载较重的 Linux 服务器上,经常会遇到“打开文件过多”的问题。这表示某个进程无法打开新的文件(文件描述符),因为它已经打开了过多的文件。“最大打开文件限制”是 Linux 上每个进程或用户默认预先设定的,并且设置值较低。

并发文件描述符用户和进程的数量是有限制的。当用户或进程尝试打开更多文件描述符时,达到此限制就会出现“打开文件过多”错误。

因此,解决此问题的办法是增加用户或进程可以打开的文件描述符的最大数量。

注意 − Linux 命令区分大小写。

文件描述符

进程用来标识已打开文件的无符号整数称为文件描述符。

sys/limits.h 文件中包含的 /OPEN MAX 控件设置了进程可以使用文件描述符数量的限制。ulimit -n 参数也控制文件描述符的数量。子程序 open、pipe、creat 和 fcntl 都会生成文件描述符。大多数情况下,文件描述符是特定于每个进程的。但是,它们有时可以由 fork 子程序创建的子进程共享,或者由 fcntl、dup 和 dup2 子程序复制。

文件描述符是内核为每个进程在其 u 块区域中维护的文件描述符数据库的索引。打开和创建操作以及从父进程继承是最常见的进程获取文件描述符的方法。当发生 fork 操作时,子进程的描述符表会被复制,使其能够平等地访问父进程使用的文件。

文件描述符限制

进程一次可以打开的文件描述符数量有限制。一个是软限制,它永远不能超过硬限制,并且可以由任何非特权用户调整。非特权用户可以降低硬限制,但不能再次提高它,而特权用户(如 root)可以根据需要提高和降低它。

示例

运行以下命令以验证当前会话的文件描述符限制。

$ ulimit -n 

输出

1024 

如上所示,上限是 1024。

示例

现在让我们运行以下命令来检查用户限制:

$ ulimit -u 

输出

31211

示例

使用以下命令找出当前打开的文件数量:

$ lsof  |  wc  -l

输出

363869

示例

要分别检查当前会话的软限制和硬限制,我们使用带 -Sn 和 -Hn 标志的 ulimit 命令:

$ ulimit -Sn

输出

1024
$ ulimit -Hn

输出

4096

增加文件描述符限制

让我们尝试使用 ulimit -n 命令来设置当前会话的限制:

示例

$ ulimit -n 4096
$ ulimit -n 

输出

4096

通过对 /etc/security/limits.conf 文件进行一些更改并重新登录,我们可以全局地修改所有进程的软限制和硬限制:

*         hard    nofile       500000
*         soft    nofile       500000
root      hard    nofile       500000
root      soft    nofile       500000

结论

在本教程中,我们学习了一些修复 Linux 中“打开文件过多”错误的示例。任何 Linux 用户都可以快速修复此问题。随意尝试 Linux 提供的任何方法来解决此问题,以消除此错误。上述步骤适用于各种 Linux 发行版。所有操作系统都必须将文件描述符作为基本元素。

我希望您发现这些命令示例有用,并有助于探索 Linux

更新于:2023年3月23日

27K+ 浏览量

启动您的 职业生涯

完成课程获得认证

开始
广告