最近我遇到了这个问题在我们的生产机器之一。 PHP的实际问题如下所示:
fopen(dberror_20110308.txt):无法打开stream:打开的文件太多
我在这台机器上运行LAMP堆栈和memcache。 我也在这台机器上运行了几个Java应用程序。 虽然我确实增加了可以打开的文件数量限制(从1024开始),但是我真的很想知道是否有一种简单的方法来跟踪这个(随时打开的文件数量)作为度量标准。 我知道lsof是一个命令,它将列出进程打开的文件描述符。 想知道是否有其他更好的(在报告方面)跟踪这个使用说,nagios的方式。
你可以看看/ 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列。
/proc/sys/fs/file-nr显示系统范围内打开的文件描述符的数量和系统范围的最大值。 对于单个进程,你可以看看/proc/$pid/fd/* 。
/ proc / sys / fs / file-nr给你系统上打开文件的总数(这是有限制的),但是你目前的问题是每个进程打开文件的数量
每个打开的文件都由/ proc / pid / fd中的文件表示
所以你只需要确定正在打开大量文件(看起来像你的数据库是问题)的进程的pid,并计算相应的文件。
但是我认为它有点奇怪,它似乎是一个数据库打开文件太多。 并无法打开一个txt文件?