为啥 jeprof 评估的 jemalloc 内存配置文件似乎显示了所有内存分配?

Posted

技术标签:

【中文标题】为啥 jeprof 评估的 jemalloc 内存配置文件似乎显示了所有内存分配?【英文标题】:Why does jemalloc memory profile evaluated by jeprof seem to show all memory allocations?为什么 jeprof 评估的 jemalloc 内存配置文件似乎显示了所有内存分配? 【发布时间】:2020-10-29 14:58:25 【问题描述】:

我们正在尝试追踪使用 jemalloc (5.2.0) 的 proxysql (2.0.14) 中的内存泄漏。我们在启用调试符号的情况下编译了 proxysql。烘焙到proxysql中的jemalloc配置is the following:

xmalloc:true,lg_tcache_max:16,prof:true,prof_leak:true,lg_prof_sample:20,lg_prof_interval:30,prof_active:false

在运行时使用PROXYSQL MEMPROFILE START 启用内存分析,如here 所示。这会将内存分析设置为active

bool en=true;
mallctl("prof.active", NULL, NULL, &en, sizeof(bool));

这似乎在生成堆配置文件时起作用,但是当我们使用 jeprof 分析它们时,它似乎记录了所有内存分配,而不仅仅是内存泄漏。我们使用 jeprof 生成的 pdf 可以在 here 找到。如您所见,jeprof 似乎显示了所有内存分配,而不仅仅是泄漏的。

通过查看other memory profiles,它们显示的总内存量较小,而在此配置文件中,我们看到的总内存量为 21GB,超过了服务器可以分配的内存量。但是,我们不确定问题出在哪里 - jeprof、配置或其他问题。

作为参考,我们添加了一个示例堆配置文件here,以防万一这表明出了什么问题。

【问题讨论】:

【参考方案1】:

我认为这可能反映出“泄漏”的含义有些模糊。像 Valgrind 这样的工具会在关闭时遍历程序的指针图,如果遍历没有找到一些实时分配,则将其视为泄漏。

其他工具将“泄漏”简单地视为已分配但未释放的任何内容。 jemalloc 中的分析模式更像是这种方式。它报告在程序终止时可归因于各种调用堆栈的活动字节的估计值。

【讨论】:

以上是关于为啥 jeprof 评估的 jemalloc 内存配置文件似乎显示了所有内存分配?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 通过 jemalloc 管理内存

MySQL 通过 jemalloc 管理内存

MySQL 通过 jemalloc 管理内存

使用jemalloc优化MysqlPHP内存占用

JeMalloc 不创建内存泄漏转储

利用jemalloc分析内存泄漏以及LD_PRELOAD--转载--可以为定位内存问题的雏形