打开文件过多问题(在 CentOS 中)

打开文件过多问题(在 CentOS 中)

最近,我在我们的一台生产机器上遇到了这个问题。PHP 的实际问题如下:

fopen(dberror_20110308.txt):无法打开流:打开的文件太多

我正在这台机器上运行 LAMP 堆栈和 memcache。我还在这台机器上运行了几个 Java 应用程序。虽然我确实将可打开文件数的限制从 1024 增加到了 10000,但我真的很想知道是否有一种简单的方法可以将其(任何时刻打开的文件数)作为指标进行跟踪。我知道 lsof 是一个命令,它将列出进程打开的文件描述符。想知道是否有其他更好的(就报告而言)方法可以使用 nagios 来跟踪这一点。

答案1

您可以看看 /proc/sys/fs/file-nr

cat /proc/sys/fs/file-nr
3391    969     52427
|        |       |
|        |       |
|        |       maximum open file descriptors
|        total free allocated file descriptors
total allocated file descriptors

总分配的文件描述符表示自启动以来分配的文件描述符数量。这可以看作是一次打开的最大文件数的最高水位线。当这些文件被释放时,它们会进入第二列,因此任何给定时间打开的文件数将是第 1 列 - 第 2 列。

答案2

/proc/sys/fs/file-nr显示系统范围内打开的文件描述符数量以及系统范围内的最大值。对于单个进程,您可以查看/proc/$pid/fd/*

答案3

/proc/sys/fs/file-nr 为您提供系统上打开文件的总数量(并且对此有一个限制),但您当前的问题是打开文件的数量每个进程

每个打开的文件都由 /proc/ 中的一个文件表示进程号/fd

因此,您只需要识别打开大量文件的进程的 pid(看起来您的数据库是问题所在)并计算相应的文件数。

但我确实认为这有点奇怪,它似乎是一个打开了太多文件的数据库。并且无法打开 txt 文件?

相关内容