欢迎来到站长教程网!

mssql

当前位置:主页 > 数据库 > mssql >

当master down掉后,pt-heartbeat不绝重试会导致内存迟钝增长的原因及办理步伐

时间:2021-05-05|栏目:mssql|点击:

最近同事反应,在利用pt-heartbeat监控主从复制延迟的进程中,假如master down掉了,则pt-heartbeat则会毗连失败,但会不绝重试。

重试本无可厚非,究竟从利用者的角度来说,但愿pt-heartbeat能不绝重试,直到从头毗连上数据库。可是,他们发明,不绝的重试会带来内存的迟钝增长。

重现

情况:

pt-heartbeat v2.2.19,MySQL社区版 v5.6.31,Perl v5.10.1,RHEL 6.7,内存500M

为了制止数据库启停对pt-heartbeat内存利用率的影响,故MySQL和pt-heartbeat别离运行在差异的主机上。

运行pt-heartbeat

# pt-heartbeat --update -h 192.168.244.10 -u monitor -p monitor123 -D test --create-table

监控pt-heartbeat的内存利用率

获取pid

# ps -ef |grep pt-heartbeat
root 1505 1471 0 19:13 pts/0 00:00:08 perl /usr/local/bin/pt-heartbeat --update -h 192.168.244.10 -u monitor -p monitor123 -D test --create-table
root 1563 1545 2 19:50 pts/3 00:00:00 grep pt-heartbeat

查察该历程的内存利用率

# top -p 1505

运行了0:15.00(TIME+列),MEM一直不变在3.3%

当master down掉后,pt-heartbeat不停重试会导致内存痴钝增长的原因及治理步骤

现封锁数据库

# service mysqld stop

适才的pt-heartbeat呼吁不绝输出以下信息

当master down掉后,pt-heartbeat不停重试会导致内存痴钝增长的原因及治理步骤

同样CPU时间后,MEM增长到4.4%, 增长了1%,思量到内存500M,该历程的内存占用增加了5M,固然不是许多,但思量到历程的内存增加并没有遏制的意思,这个现象照旧要引起留意的。

当master down掉后,pt-heartbeat不停重试会导致内存痴钝增长的原因及治理步骤

同时,通过pmap呼吁,发明,0000000001331000地点的RSS和Dirry也会增长,增长的速率是4k/s

当master down掉后,pt-heartbeat不停重试会导致内存痴钝增长的原因及治理步骤

厥后研究pt-heartbeat的源码,才发明代码有点bug

my $tries = 2;
while ( !$dbh && $tries-- ) {
PTDEBUG && _d($cxn_string, ' ', $user, ' ', $pass,
join(', ', map { "$_=>$defaults->{$_}" } keys %$defaults ));
$dbh = eval { DBI->connect($cxn_string, $user, $pass, $defaults) };
if ( !$dbh && $EVAL_ERROR ) {
if ( $EVAL_ERROR =~ m/locate DBD\/mysql/i ) {
die "Cannot connect to MySQL because the Perl DBD::mysql module is "
. "not installed or not found. Run 'perl -MDBD::mysql' to see "
. "the directories that Perl searches for DBD::mysql. If "
. "DBD::mysql is not installed, try:\n"
. " Debian/Ubuntu apt-get install libdbd-mysql-perl\n"
. " RHEL/CentOS yum install perl-DBD-MySQL\n"
. " OpenSolaris pgk install pkg:/SUNWapu13dbd-mysql\n";
}
elsif ( $EVAL_ERROR =~ m/not a compiled character set|character set utf8/ ) {
PTDEBUG && _d('Going to try again without utf8 support');
delete $defaults->{mysql_enable_utf8};
}
if ( !$tries ) {
die $EVAL_ERROR;
}
}
}

以上代码摘自get_dbh函数,用于获取数据库的毗连,假如获取失败,则重试1次,然后通过die函数抛异常退出。

可是,通过配置如下断点,发明当$tries为0时,if函数内里的PTDEBUG && _d("$EVAL_ERROR")语句能执行,但die函数就是没有抛出异常,并退出剧本

PTDEBUG && _d($tries);
if ( !$tries ) {
PTDEBUG && _d("$EVAL_ERROR"); 
die $EVAL_ERROR; }

厥后,将上述代码的最后一个if函数修改如下:

if ( !$tries ) {
die "test:$EVAL_ERROR";
}

再次测试

启动数据库

# service mysqld start

执行pt-heartbeat呼吁

# pt-heartbeat --update -h 192.168.244.10 -u monitor -p monitor123 -D test --create-table

遏制数据库

# service mysqld stop

适才执行的pt-heartbeat呼吁异常退出

当master down掉后,pt-heartbeat不停重试会导致内存痴钝增长的原因及治理步骤

“test:”就是插手的测试字符。

结论

很奇怪,只是纯真的die $EVAL_ERROR不会抛出异常,并退出剧本,但修改后的die "test:$EVAL_ERROR"却会退出剧本。

很显然,这确实是个bug,不知道是不是与perl的版本有关。

很好奇,失败的毗连如何导致内存的不绝增长?

最后,给percona官方提了个bug

https://bugs.launchpad.net/percona-toolkit/+bug/1629164

以上所述是小编给各人先容的当master down掉后,pt-heartbeat不绝重试会导致内存迟钝增长的原因及办理步伐,但愿对各人有所辅佐,假如各人有任何疑问接待给我留言,小编会实时回覆各人的!

您大概感乐趣的文章:

上一篇:SQL SERVER 9003错误办理要领

栏    目:mssql

下一篇:SQL Server 操作触发器对多表视图举办更新的实现要领

本文标题:当master down掉后,pt-heartbeat不绝重试会导致内存迟钝增长的原因及办理步伐

本文地址:www.jiaocheng88.com.cn/mssql/61954.html

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:584415406 | 邮箱:584415406#qq.com(#换成@)

Copyright © 2015-2020 小白站长教程网 版权所有 苏ICP备20040415号-3