有时,你需要知道的<强大的>完全强大的>多少内存mysqld服务器(或任何其他程序)使用,在分配(例如函数)是什么,它如何到达那里(回溯,请!),在什么时间点分配的事情发生了。
例如;您可能已经注意到一把锋利的内存增加后执行一个特定的查询。或者,也许mysqld看似整体使用太多内存。又或者,也许你注意到mysqld的记忆缓慢增长加班,说明一个可能的内存错误。
不管什么原因,有一个简单但强大的方法来配置MySQL内存使用;从Valgrind地块工具。摘录的地块手册页面(堆内存只是分配的内存供程序使用);
地块不仅告诉你多少堆内存程序使用,这也给了很详细的信息,表明你的程序的哪些部分负责分配的堆内存。
首先,我们需要Valgrind计划。虽然您可以使用带有您的操作系统的最新版本(认为百胜或apt-get安装Valgrind),我更喜欢获得&编译最新版本(目前3.8.1):
|
1
2
3
4
5
6
7
8
9
|
sudo
百胜
删除
valgrind *
#或apt-get等。
sudo
百胜
安装
wget
使
海湾合作委员会
海湾合作委员会
- - - - - -
c
+ +
libtool
libaio
- - - - - -
重击
bzip2
glibc *
wget
http
:
/ /valgrind.org/downloads/valgrind-3.8.1.tar.bz2 #或更新
焦油
- - - - - -
xf
valgrind
- - - - - -
3.8.1.tar.bz2
cd
valgrind
- - - - - -
3.8.1
。
/
配置
使
sudo
使
安装
valgrind
- - -
版本
#检查版本一样是什么下载(3.8.1这里)
|
自编译有几个好处:
- 当使用最新版本的Valgrind,甚至编译“开箱即用”(即没有变化),你可能会看到更少的问题然后与早期版本。例如,早期版本可能层层肥肉Valgrind-internal内存跟踪分配硬编码。换句话说;你可能无法运行下huge-buffer-pool Valgrind很快没有抱怨。
- 如果您自己编译,Valgrind-internal限制仍然太小,在编译之前,您可以轻松地更改它们。一个经常撞在coregrind设置VG_N_SEGMENTS / m_aspacemgr / aspacemgr-linux。c(当你看到“Valgrind:致命:VG_N_SEGMENTS太低”)
- 更新的版本(更好的)支持新的硬件和软件。
一旦“valgrind - version”返回正确的安装版本,你准备好了。在这个例子中,我们将编写输出到/ tmp / massif.out。如果你喜欢使用另一个位置(,因此必然会设置适当的文件的权利等)使用:
|
1
2
|
美元
触摸
/
your_location
/
地块
。
出
美元
乔恩
用户
:
集团
/
your_location
/
地块
。
出
#使用用户mysqld现在下运行(“用户”)设置在my . cnf中所做(见<标题=“改变MySQL用户“href = " http://dev.mysql.com/doc/refman/5.5/en/changing-mysql-user.html " target = "平等" rel = " noopener noreferrer " > < / >,如果这是不清楚)
|
现在,在您运行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使用地块工具:
|
1
|
美元
valgrind
- - -
工具
=
地块
- - -
地块
- - - - - -
出
- - - - - -
文件
=
/
tmp
/
地块
。
出
/
路径
/
来
/
mysqld
{
mysqld
选项
。
。
。
}
|
注意,例如“{mysqld选项}”包括默认文件= / etc / my.cnf(如果文件位于)这就是你my . cnf中所做为了mysqld指向你的设置文件等。mysqld正常后开始(检查是否可以登录你的mysql客户端),您将执行一切你认为有必要的措施来增加内存使用量/触发记忆问题。你也可以把服务器运行一段时间(例如,如果你有经验的记忆随着时间的增加)。
一旦你做到了,关闭mysqld(同样使用正常的关机过程),然后使用ms_printmasif工具。出文件来出put a textual graph of memory usage:
|
1
|
ms_print
/
tmp
/
地块
。
出
|
一个部分的示例输出我们从最近的客户问题:
|
1
2
3
4
5
6
7
8
9
|
96.51
%
(
<
强大的
>
68年
,
180年
,
839 b
<
/
强大的
>
)
(
<
强大的
>
堆
分配
功能
<
/
强大的
>
)
malloc
/
新
/
新
(
]
,
- - -
alloc
- - - - - -
fn
,
等
。
- - - - - -
&
gt
;
<
强大的
>
50.57
%
<
/
强大的
>
(
<
强大的
>
35
,
728年
,
995 b
<
/
强大的
>
)
0 x7a3cb0
:
<
强大的
>
my_malloc
<
/
强大的
>
(
在
/
usr
/
当地的
/
雷竞技下载官网
/
mysql
- - - - - -
5.5.28
/
usr
/
sbin子
/
mysqld
)
|
- - - - - -
&
gt
;
<
强大的
>
10.10
%
<
/
强大的
>
(
<
强大的
>
7
,
135年
,
744 b
<
/
强大的
>
)
0 x7255bb
:
<
强大的
>
Log_event
::
read_log_event
<
/
强大的
>
(
字符
常量
*
,
无符号
int
,
字符
常量
*
*
,
Format_description_log_event
常量
*
)
(
在
/
usr
/
当地的
/
雷竞技下载官网
/
mysql
- - - - - -
5.5.28
/
usr
/
sbin子
/
mysqld
)
|
|
- - - - - -
&
gt
;
10.10
%
(
7
,
135年
,
744 b
)
0 x728daa
:
Log_event
::
read_log_event
(
st_io_cache *
,
st_mysql_mutex *
,
Format_description_log_event
常量
*
)
(
在
/
usr
/
当地的
/
雷竞技下载官网
/
mysql
- - - - - -
5.5.28
/
usr
/
sbin子
/
mysqld
)
|
|
- - - - - -
&
gt
;
10.10
%
(
7
,
135年
,
744 b
)
0 x5300a8
:
吗?
吗?
吗?
(
在
/
usr
/
当地的
/
雷竞技下载官网
/
mysql
- - - - - -
5.5.28
/
usr
/
sbin子
/
mysqld
)
|
|
|
- - - - - -
&
gt
;
10.10
%
(
7
,
135年
,
744 b
)
0 x5316ec
:
handle_slave_sql
(
在
/
usr
/
当地的
/
雷竞技下载官网
/
mysql
- - - - - -
5.5.28
/
usr
/
sbin子
/
mysqld
)
|
|
|
- - - - - -
&
gt
;
10.10
%
(
7
,
135年
,
744 b
)
0 x3ecf60677b
:
start_thread
(
在
/
lib64
/
libpthread
- - - - - -
2.5.so
)
|
|
|
- - - - - -
&
gt
;
10.10
%
(
7
,
135年
,
744 b
)
0 x3ecead325b
:
克隆
(
在
/
lib64
/
libc
- - - - - -
2.5.so
)
(
。
。
。
]
|
几个快照后:
|
1
2
3
4
5
6
7
8
|
92.81
%
(
<
强大的
>
381年
,
901年
,
760 b
<
/
强大的
>
)
(
<
强大的
>
堆
分配
功能
<
/
强大的
>
)
malloc
/
新
/
新
(
]
,
- - -
alloc
- - - - - -
fn
,
等
。
- - - - - -
&
gt
;
<
强大的
>
84.91
%
<
/
强大的
>
(
<
强大的
>
349年
,
404年
,
796 b
<
/
强大的
>
)
0 x7a3cb0
:
<
强大的
>
my_malloc
<
/
强大的
>
(
在
/
usr
/
当地的
/
雷竞技下载官网
/
mysql
- - - - - -
5.5.28
/
usr
/
sbin子
/
mysqld
)
|
- - - - - -
&
gt
;
<
强大的
>
27.73
%
<
/
强大的
>
(
<
强大的
>
114年
,
084年
,
096 b
<
/
强大的
>
)
0 x7255bb
:
<
强大的
>
Log_event
::
read_log_event
<
/
强大的
>
(
字符
常量
*
,
无符号
int
,
字符
常量
*
*
,
Format_description_log_event
常量
*
)
(
在
/
usr
/
当地的
/
雷竞技下载官网
/
mysql
- - - - - -
5.5.28
/
usr
/
sbin子
/
mysqld
)
|
|
- - - - - -
&
gt
;
27.73
%
(
114年
,
084年
,
096 b
)
0 x728daa
:
Log_event
::
read_log_event
(
st_io_cache *
,
st_mysql_mutex *
,
Format_description_log_event
常量
*
)
(
在
/
usr
/
当地的
/
雷竞技下载官网
/
mysql
- - - - - -
5.5.28
/
usr
/
sbin子
/
mysqld
)
|
|
- - - - - -
&
gt
;
27.73
%
(
114年
,
084年
,
096 b
)
0 x5300a8
:
吗?
吗?
吗?
(
在
/
usr
/
当地的
/
雷竞技下载官网
/
mysql
- - - - - -
5.5.28
/
usr
/
sbin子
/
mysqld
)
|
|
|
- - - - - -
&
gt
;
27.73
%
(
114年
,
084年
,
096 b
)
0 x5316ec
:
handle_slave_sql
(
在
/
usr
/
当地的
/
雷竞技下载官网
/
mysql
- - - - - -
5.5.28
/
usr
/
sbin子
/
mysqld
)
|
|
|
- - - - - -
&
gt
;
27.73
%
(
114年
,
084年
,
096 b
)
0 x3ecf60677b
:
start_thread
(
在
/
lib64
/
libpthread
- - - - - -
2.5.so
)
|
|
|
- - - - - -
&
gt
;
27.73
%
(
114年
,
084年
,
096 b
)
0 x3ecead325b
:
克隆
(
在
/
lib64
/
libc
- - - - - -
2.5.so
)
|
正如你所看到的,大量的(在这种情况下“太多”)内存被分配给Log_event:: read_log_event函数。您还可以看到内存分配函数横渡快照的显著增长。这个例子帮助确定内存泄漏故障过滤奴隶(在实际阅读更多错误报告)。
除了运行Valgrind地块在上面的方法中,你也可以改变地块的快照选项和其他cmd行选项与快照的频率等,以满足您的特定需求。然而,你可能会发现默认选项将在大多数场景的表现良好。
技术先进,你可以把事情一步:Valgrind的使用gdbserver获得地块快照需求(即你可以命令行启动地块快照之前,期间和之后执行任何命令可能大大改变内存使用)。
结论:使用Valgrind地块,可能Valgrind gdbserver(不是用于解决错误例子讨论),将帮助您分析的来龙去脉mysqld(或任何其他程序)使用的内存。
学分:员工@ Percona客户、Ov雷竞技下载官网ais Laurynas,谢尔盖,乔治,弗拉季斯拉夫•,Raghavendra, Ignacio、自己和他人在Percona结合所有的努力导致了上面的信息您可以阅读。






另一个结论——就好了如果这个特性请求开放自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吗?
Aurimas -
你也't-run-that-in-production,经济放缓是10倍或更多。如果你有一个服务器需要valgrind,首先你必须减少工作负载最轻的可能仍表现出你正在调查的问题。