【问题标题】:Unpredictable File Descriptor leak不可预测的文件描述符泄漏
【发布时间】:2016-12-07 14:19:29
【问题描述】:

好的,我正在调查这似乎是 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 吗?

【问题讨论】:

  • 你能告诉我们你的代码吗
  • 这是一个相当大的项目,我认为将不可编译的部分放入其中无关紧要。我可以解释一下,我的主要实例化了一个管理器,该管理器具有 cppcms::application 作为成员和一个调用 cppcms::application::run 的 runServer 方法。我使用 aplication_pool 挂载一个将 cppcms url 映射到每个服务的类。代码在大多数情况下都能正常工作,只是有时在重载时会失败。
  • 如果确实是 cppcms,您将不得不尝试在一个小示例中隔离问题,以便我们查看它,当前信息还不够,我还没有遇到过这样的问题我自己(但我一定会更新)。

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


【解决方案1】:

对不起。在带有 mod_cgi 和 CGI​​ POST 请求的 lighttpd 1.4.43 中存在回归。问题和补丁说明见https://redmine.lighttpd.net/issues/2771

【讨论】:

  • 我不在 1.4.43 中,所以我的问题在其他地方,但我真的认为你的回答会对某人有所帮助。感谢分享。
  • 您运行的是什么版本的 lighttpd?在 lighttpd 1.4.40 及更高版本中解决了 mod_fastcgi 的一些历史资源问题。
猜你喜欢
  • 2015-09-23
  • 1970-01-01
  • 2011-01-15
  • 2014-09-20
  • 2020-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多