有时,你需要知道的<强大的>完全多少内存mysqld服务器(或任何其他程序)使用,在分配(例如函数)是什么,它如何到达那里(回溯,请!),在什么时间点分配的事情发生了。

例如;您可能已经注意到一把锋利的内存增加后执行一个特定的查询。或者,也许mysqld看似整体使用太多内存。又或者,也许你注意到mysqld的记忆缓慢增长加班,说明一个可能的内存错误。

不管什么原因,有一个简单但强大的方法来配置MySQL内存使用;从Valgrind地块工具。摘录的地块手册页面(堆内存只是分配的内存供程序使用);

地块不仅告诉你多少堆内存程序使用,这也给了很详细的信息,表明你的程序的哪些部分负责分配的堆内存。

首先,我们需要Valgrind计划。虽然您可以使用带有您的操作系统的最新版本(认为百胜或apt-get安装Valgrind),我更喜欢获得&编译最新版本(目前3.8.1):

自编译有几个好处:

  1. 当使用最新版本的Valgrind,甚至编译“开箱即用”(即没有变化),你可能会看到更少的问题然后与早期版本。例如,早期版本可能层层肥肉Valgrind-internal内存跟踪分配硬编码。换句话说;你可能无法运行下huge-buffer-pool Valgrind很快没有抱怨。
  2. 如果您自己编译,Valgrind-internal限制仍然太小,在编译之前,您可以轻松地更改它们。一个经常撞在coregrind设置VG_N_SEGMENTS / m_aspacemgr / aspacemgr-linux。c(当你看到“Valgrind:致命:VG_N_SEGMENTS太低”)
  3. 更新的版本(更好的)支持新的硬件和软件。

一旦“valgrind - version”返回正确的安装版本,你准备好了。在这个例子中,我们将编写输出到/ tmp / massif.out。如果你喜欢使用另一个位置(,因此必然会设置适当的文件的权利等)使用:

现在,在您运行mysqld Valgrind下,确保调试符号。调试符号二进制时存在不剥夺了他们(下载“遗传算法”(一般可用)包可能包含优化或剥夺了二进制文件,优化速度而不是调试)。如果二进制文件是剥夺了,你有几个选择的调试版本mysqld用于内存分析的目的:

  • 下载适当的debuginfo包(这些可能不是对所有版本可用)。
  • 下载调试的二进制文件与您正在使用相同的服务器版本,并简单地使用debug mysqld作为当前mysqld的替代(即关闭,mv mysqld mysqld。老,cp / debug_bin_path mysqld。/ mysqld,启动)。
  • 如果你有(通过下载或从过去的存储)源代码可用(您目前正在使用的服务器版本一样)然后只需debug-compile源和使用mysqld二进制作为替代,最后一点所示。(例如,Percona Se雷竞技下载官网rver 5.5可以通过使用“debug-compiled来源。/构建/构建二进制调试……”)。

Valgrind地块需要调试符号信息,以便打印堆栈跟踪显示内存的消耗。没有可用的调试符号,你将无法看到实际的函数调用内存使用情况负责。如果你不确定你是否已将二进制文件,简单测试下面的程序,看看你得到输出。

一旦你所有的设置与调试符号,关闭mysqld服务器使用你的标准关闭程序,然后手动重启下Valgrind使用地块工具:

注意,例如“{mysqld选项}”包括默认文件= / etc / my.cnf(如果文件位于)这就是你my . cnf中所做为了mysqld指向你的设置文件等。mysqld正常后开始(检查是否可以登录你的mysql客户端),您将执行一切你认为有必要的措施来增加内存使用量/触发记忆问题。你也可以把服务器运行一段时间(例如,如果你有经验的记忆随着时间的增加)。

一旦你做到了,关闭mysqld(同样使用正常的关机过程),然后使用ms_printmasif工具。出文件来出put a textual graph of memory usage:

一个部分的示例输出我们从最近的客户问题:

几个快照后:

正如你所看到的,大量的(在这种情况下“太多”)内存被分配给Log_event:: read_log_event函数。您还可以看到内存分配函数横渡快照的显著增长。这个例子帮助确定内存泄漏故障过滤奴隶(在实际阅读更多错误报告)。

除了运行Valgrind地块在上面的方法中,你也可以改变地块的快照选项和其他cmd行选项与快照的频率等,以满足您的特定需求。然而,你可能会发现默认选项将在大多数场景的表现良好。

技术先进,你可以把事情一步:Valgrind的使用gdbserver获得地块快照需求(即你可以命令行启动地块快照之前,期间和之后执行任何命令可能大大改变内存使用)。

结论:使用Valgrind地块,可能Valgrind gdbserver(不是用于解决错误例子讨论),将帮助您分析的来龙去脉mysqld(或任何其他程序)使用的内存。

学分:员工@ Percona客户、Ov雷竞技下载官网ais Laurynas,谢尔盖,乔治,弗拉季斯拉夫•,Raghavendra, Ignacio、自己和他人在Percona结合所有的努力导致了上面的信息您可以阅读。

3评论
最古老的
最新的 大多数投票
内联反馈
查看所有评论
马克·卡拉汉

另一个结论——就好了如果这个特性请求开放自2007年以来与固定在官方MySQL——一个示例实现http://bugs.mysql.com/bug.php?id=31932。有趣的时候是打开的时间足够长,我文件复制特性请求-http://bugs.mysql.com/bug.php?id=64353

嗨Roel,

非常感谢这个非常有用的帖子。我在想,什么是运行mysqld的性能损失(或任何其他程序)在地块/ Valgrind吗?它可能会改变很多,但是我不知道这就像几乎没有明显的还是更像你't-run-that-in-production吗?

Laurynas Biveinis

Aurimas -

你也't-run-that-in-production,经济放缓是10倍或更多。如果你有一个服务器需要valgrind,首先你必须减少工作负载最轻的可能仍表现出你正在调查的问题。