在 Apache httpd 和模块中搜索内存泄漏

Posted

技术标签:

【中文标题】在 Apache httpd 和模块中搜索内存泄漏【英文标题】:Searching for memory leaks in Apache httpd and modules 【发布时间】:2011-01-17 07:15:17 【问题描述】:

在 Apache httpd 和 httpd 模块中查找内存泄漏的最佳方法是什么?

有什么方法吗?

我尝试了一些 valgrind,但几乎没有出现障碍:

    Valgrind 期望二进制文件正常退出。我已经设法使用 MaxRequestsPerChild 和 -X 参数做到了。 Valgrind 报告了很多东西,可能与 apr 池有关,但没有任何用处。

操作系统:Linux

附:

Valgrind 命令:$ valgrind --leak-check=full --leak-resolution=med --log-file=/tmp/valgrind.log ./bin/httpd -X

Valgrind 输出示例:http://paste-it.net/public/x5b6e8b/

【问题讨论】:

【参考方案1】:

我不知道有什么灵丹妙药,但你可以看看 valgrind/valgrind.h ,它有一些有用的宏可以让 Valgrind 感知并在运行时改变它们的行为瓦尔格林。

例如

#ifndef HAVE_VALGRIND_VALGRIND_H
#define RUNNING_ON_VALGRIND 0
#else
#include <valgrind/valgrind.h>
#endif

if (RUNNING_ON_VALGRIND) 
    printf("Hello, this is Valgrind instance %d\n", RUNNING_ON_VALGRIND);
    /* set debug output annoyingly high */
    /* exit after one request */

您还可以使用 NDEBUG 将整个混乱包裹起来,以防止它出现在生产版本中。

这应该可以让您不必在每次调试时都摆弄服务器,如果检测到 Valgrind,它将“只做”。 RUNNING_ON_VALGRIND 将扩展为 valgrind 实例,如果不适用,则保持为 0。

对于其余部分(我想您会收到大量噪音,很可能从 invalid read of size xx 开始),您可以系统地应用抑制。如果您发布一些输出,可能会更容易为您可以粘贴在文件中的抑制提出建议。

顺便说一句,Valgrind 用户的邮件列表非常很有帮助,而且非常宽容。你也可以在那里发布你最烦人和不相关的噪音,你会很快得到如何抑制它的回复。

如果您想要的只是泄漏的摘要以及导致泄漏的入口点,那么关闭几乎所有其他内容应该不会太难。

【讨论】:

我添加了 valgrind 输出。有很多东西,其中很少来自我的模块。【参考方案2】:

您可以尝试集成 Bohem GC 并让垃圾收集来检测内存泄漏。

请参见此处了解操作方法:http://www.hpl.hp.com/personal/Hans_Boehm/gc/leak.html

【讨论】:

【参考方案3】:

也许是时候重构代码以便可以在 apache 之外运行测试了?

如果您添加检查分配内存的代码路径的单元测试,您可以通过在 valgrind 下运行单元测试来验证所有内存是否已释放。这样您就不必担心让在 apache 下运行的完整代码只处理少量事务。此外,使用单元测试来测试所有代码路径会更容易。

【讨论】:

以上是关于在 Apache httpd 和模块中搜索内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

在 Apache httpd 进程中定位内存泄漏,基于 PHP/Doctrine 的应用程序

使用ulimit防止Apache内存泄漏

内存分析和搜索内存泄漏[关闭]

通过tracemalloc模块在python中发现内存泄漏

正确配置 ActiveMQ 以避免 Producer 内存泄漏

ISRG宣布用Rust重写Apache httpd服务器主程序 以提升内存安全性