最近,我在我们的一台生产机器上遇到了这个问题。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 文件?