Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 尽管多线程web应用程序有很高的限制,但MMAP文件的文件描述符已用完_C++_Linux_Multithreading_Mmap_File Descriptor - Fatal编程技术网

C++ 尽管多线程web应用程序有很高的限制,但MMAP文件的文件描述符已用完

C++ 尽管多线程web应用程序有很高的限制,但MMAP文件的文件描述符已用完,c++,linux,multithreading,mmap,file-descriptor,C++,Linux,Multithreading,Mmap,File Descriptor,我有一个MMAP大量文件的应用程序。三千多。它还使用大约75个辅助线程。应用程序是用java和C++混合编写的,java服务器代码通过JNI调用C++。 它经常(尽管不可预测)耗尽文件描述符。我已将/etc/security/limits.conf中的限制提高到: * hard nofile 131072 /proc/sys/fs/file最大值为101752。该系统是一个Linode VPS,运行Ubuntu8.04 LTS和内核2.6.35.4 在某个点之后,java和C++的代码位都会打

我有一个MMAP大量文件的应用程序。三千多。它还使用大约75个辅助线程。应用程序是用java和C++混合编写的,java服务器代码通过JNI调用C++。 它经常(尽管不可预测)耗尽文件描述符。我已将/etc/security/limits.conf中的限制提高到:

* hard nofile 131072
/proc/sys/fs/file最大值为101752。该系统是一个Linode VPS,运行Ubuntu8.04 LTS和内核2.6.35.4

在某个点之后,java和C++的代码位都会打开失败。Netstat没有显示大量打开的套接字(“Netstat-n | wc-l”小于500)。lsof或/proc/{pid}/fd中打开的文件数量大约为2000-5000

这几周来,我一直在抓救命稻草(不是经常抓,而是每次我接到事情发展迅速的通知时,都会闪现出恐惧和厌恶)

还有一些其他松散的线程让我想知道它们是否提供了一些见解:

  • 由于进程有大约75个线程,如果mmaped文件以某种方式占用了每个线程一个文件描述符,那么这些数字相加。这就是说,对/proc/{pid}/tasks/*/fd中的内容进行递归计数时,当前列出了215575个fd,因此看起来它应该已经达到了极限,而不是,所以这似乎不太可能

  • Apache+Passenger也在同一个机器上运行,在文件描述符数量最多的情况下排名第二,但即使有孩子,这些进程也没有一个超过10k的描述符


我不知道从那里去哪里。很明显,有什么东西让这个应用程序达到了极限,但我完全不知道下一步要检查什么。有什么想法吗?

您的设置使用了大量可能也会泄漏的代码;JVM。也许您可以在sun和开源JVM之间切换,以检查这些代码是否偶然有罪。此外,jvm还可以使用不同的垃圾收集器策略。使用不同的一个或不同的大小将导致或多或少的垃圾收集(在java中包括关闭描述符)


我知道这有点牵强,但似乎你已经遵循了所有其他选项;)

您的安装程序使用了大量可能也会泄漏的代码;JVM。也许您可以在sun和开源JVM之间切换,以检查这些代码是否偶然有罪。此外,jvm还可以使用不同的垃圾收集器策略。使用不同的一个或不同的大小将导致或多或少的垃圾收集(在java中包括关闭描述符)


我知道这有点牵强,但似乎你已经遵循了所有其他选项;)

所以,据我所知,这似乎是Ubuntu 8.04特有的问题。升级到10.04后,一个月后,没有一个实例出现此问题。配置没有改变,所以我相信这一定是一个内核错误。

所以,据我所知,这似乎是Ubuntu 8.04特有的问题。升级到10.04后,一个月后,没有一个实例出现此问题。配置没有更改,因此我认为这一定是内核错误。

您能澄清故障模式吗?对于
mmap();mmap();close();munmap()
-即使文件再次关闭,映射仍将保持。你所描述的看起来更像是在某处泄漏文件描述符,也就是说,没有在你应该关闭的地方关闭文件。是的,我也怀疑有泄漏——最初的想法是将帖子标题改为“调试文件描述符泄漏的工具”。我在日志中得到的信息如下:我在日志中得到的信息如下:java.io.FileNotFoundException:{path}(打开的文件太多)首先尝试低级操作-
strace-e trace=mmap,munmap,open,close-p
,以确定应用程序是否正确关闭了文件。在运行过程中,您应该观察要重用的文件描述符编号,并且应该看到对以前打开的文件的实际
close()
调用。因为这是Java,所以打开/mmaps/关闭文件的对象的生命周期是什么样子的?从析构函数中关闭可能不是一个好主意,因为您不能严格知道垃圾收集器何时运行。MMAMP实际上发生在java/C++分界的C++侧,我只包含了java错误,因为它比FoLoad的空结果(只是打印,例如“不能打开{PAT}}”)更具有描述性。在C++方面。我会做一些记录,看看有没有什么有用的东西从那里跳出来。在C++代码中,它只关闭析构函数中的文件描述符(对于MaFdDfile类)。我挂起打开的文件,而不是立即关闭描述符,因为映射大小通常会随着文件的扩展而改变,尽管可以使用Linux特定的mremap检查strace输出似乎基本上与/proc/{pid}中的内容匹配/fd——也就是说,有一个fd被分配给应该保持打开的文件,没有明显的泄漏,应该关闭和回收的东西正在关闭和回收。你能澄清故障模式吗?对于
mmap();mmap();close();munmap()
-即使文件再次关闭,映射仍将保持。你所描述的看起来更像是在某处泄露文件描述符,也就是说,没有在你应该关闭的地方关闭文件。是的,我也怀疑有泄漏——最初是想把帖子的标题写下来