修复 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 命令来设置当前会话的限制−
如上所示,上限为 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 文件进行一些更改并重新登录,这样我们就可以全局修改所有进程的软硬限制 −
示例
$ 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。
相关文章
有用资源
linux 参考教程 - 该教程包含有关 linux 的更多信息:https://www.cainiaomax.com/linux/

