不可预知的文件描述符泄漏

时间:2016-12-07 14:19:30

标签: c++ linux memory-leaks lighttpd cppcms

好的,所以我正在调查哪个似乎是FD泄漏。

这是一个用C ++ 11编写的linux CppCms应用程序,我使用发送大约250个请求/秒的工具对其进行测试。

测试时间为30分钟,有时我会收到lighttpd (server.c.1446) [note] sockets disabled, out-of-fds错误。

我开始使用watch "sudo ls /proc/<lighttpd>/fd/ | wc -l; echo /;sudo ls /proc/<myApp>/fd/ | wc -l;echo /; sysctl fs.file-nr"

调查FD

结果似乎说一切都很好,直到不是。 FD稳定(50-100)并随机上升到lighttpd max-fd数。 如果涉及我的申请,我认为它会提前发生(不是在200000次成功请求之后)

我用valgrind试图看到任何东西,我发现了这个:

==5647== Open AF_UNIX socket 6: <unknown>
==5647==    at 0x8E379EA: socketpair (syscall-template.S:84)
==5647==    by 0x97F8001: booster::aio::socket_pair(booster::aio::stream_socket&, booster::aio::stream_socket&) (stream_socket.cpp:570)
==5647==    by 0x7312766: cppcms::service::setup_exit_handling() (service.cpp:378)
==5647==    by 0x73135C7: cppcms::service::run() (service.cpp:572)
==5647==    by 0x43F56E: MainMngr::runServer() (mainmngr.cpp:46)
==5647==    by 0x443A95: main (main.cpp:22)
==5647== 
==5647== Open AF_UNIX socket 5: <unknown>
==5647==    at 0x8E379EA: socketpair (syscall-template.S:84)
==5647==    by 0x97F8001: booster::aio::socket_pair(booster::aio::stream_socket&, booster::aio::stream_socket&) (stream_socket.cpp:570)
==5647==    by 0x7312766: cppcms::service::setup_exit_handling() (service.cpp:378)
==5647==    by 0x73135C7: cppcms::service::run() (service.cpp:572)
==5647==    by 0x43F56E: MainMngr::runServer() (mainmngr.cpp:46)
==5647==    by 0x443A95: main (main.cpp:22)

我无法说这是否是真正的文件描述符泄漏,但似乎是这样。

我的代码有问题吗? CppCms有问题吗? 你遇到过这样的问题吗? 您有任何提示可以检测谁将文件描述符句柄从100增加到8000吗?

1 个答案:

答案 0 :(得分:1)

对不起。 lighttpd 1.4.43中有mod_cgi和CGI POST 请求的回归。 https://redmine.lighttpd.net/issues/2771

中提供了问题和补丁的说明