c++ - 不可预测的文件描述符泄漏

标签 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 吗?

最佳答案

对不起。 lighttpd 1.4.43 中有一个 mod_cgi 和 CGI​​ POST 请求的回归。 https://redmine.lighttpd.net/issues/2771 中提供了问题和补丁的描述

关于c++ - 不可预测的文件描述符泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41019790/

相关文章:

c++ - 在for循环中声明和初始化变量

linux - 从长行中按位置删除字段

linux - 如何打印由 sed/awk 更改的行号

Linux clock_gettime(CLOCK_MONOTONIC) 奇怪的非单调行为

python - 为什么在 django 中进行大型查询(或一系列查询)后内存没有释放到系统?

c++ - 将引用插入 vector ,函数退出后引用是否有效?

c++ - 如何在不将其用作行尾的情况下将 "\"输出到文件

c++ - 为什么需要同时使用 fixed 和 showpoint 操纵器来显示小数点和尾随零,而只有 fixed 才能完成这项工作?

c++ - Valgrind报告QThread::start()上的内存泄漏

Javascript内存泄漏setTimeout问题