VPS 上“系统中打开的文件过多”,且 LSOF 远未达到 MAXFILES

VPS 上“系统中打开的文件过多”,且 LSOF 远未达到 MAXFILES

再会。

最近,我的 VPS 服务器(上面装有 CentOS)开始崩溃,出现“系统中打开的文件过多”错误。我阅读了很多关于此错误的信息,知道这个限制是由我的托管服务提供商设置的。我从托管服务提供商那里收到了一个限制列表,他们说这个限制是12000文件。

我尝试使用lsof实用程序。当问题发生时,我设法找到了 lsof stat 的那些响应:

[root@XXXXXXXX]# lsof | wc -l 
3895

有时甚至上升到4300左右,但我从未看到它跳得比这更高。

问题表述如下:可以lsof实用程序显示的结果不完整,还是主机的问题?如果是 lsof,那么我可以使用什么来获得最大精确度的数字?

答案1

您可以/proc/sys/fs/file-nr使用所选择的工具进行监控,最简单的是cat /proc/sys/fs/file-nr- 第一个数字显示分配的文件句柄,第二个数字显示已分配但未使用的文件句柄,最后一个数字显示最大文件句柄数。

该信息由内核本身提供。

答案2

重要的是您的主机如何测量打开的文件数。这当然/proc/sys/fs/file-nr是一个很好的选择,所以对此 +1。

lsof但是,包括未计入总数的“文件”。如果 file-nr 显示的打开的文件句柄比 lsof 列出的要多,我会感到惊讶。

另一件需要注意的事情是文件描述符表的大小。每个进程都有一个 FD 表,但还有一个系统文件表。您的主机可能做出了(坦率地说很荒谬的)决定,通过每个进程的 FD 表来计算打开的文件。您可以将其视为每个进程的FDSize字段/proc/<pid>/status。它的大小必须是 2 的倍数,并且大小增加到可以容纳所有打开文件的 2 的最小倍数。我们可以将所有 FDSize 条目相加。同样,这将是衡量打开文件的一种不寻常的方法,但除了一个进程快速打开许多文件会迅速增加您的使用量之外,我无法解释为什么它们的数量要高得多。

我使用了一个脚本来计算所有打开进程的 FDSize 总数,并在两个测试系统上尝试了所有三个计数(以 root 身份):

$ cat /proc/sys/fs/file-nr
544     0   12640
$ lsof | wc -l
1377
$ find /proc/ -maxdepth 1 -type d -regex '^/proc/[0-9]+$' -exec grep -Hi FDSize '{}'/status \; | cut -f 2 | awk '{total = total + $1}END{print total}'
5888

$ cat /proc/sys/fs/file-nr
8670    0   1587168
$ sudo /usr/sbin/lsof | wc -l
12309
$ find /proc/ -maxdepth 1 -type d -regex '^/proc/[0-9]+$' -exec grep -Hi FDSize '{}'/status \; | cut -f 2 | awk '{total = total + $1}END{print total}'
33088

您可能只需询问主机他们如何测量打开的文件数。实际上,FDSize 完全是无稽之谈,我无法想象他们真的会这样做,但这是我能想到的唯一一种夸大打开文件数的方法。

相关内容