当master down掉后,pt-heartbeat不断重试会导致内存缓慢增长

当master down掉后,pt-heartbeat不断重试会导致内存缓慢增长,第1张

概述最近同事反映,在使用pt-heartbeat监控主从复制延迟的过程中,如果master down掉了,则pt-heartbeat则会连接失败,但会不断重试。 重试本无可厚非,毕竟从使用者的角度来说,希

最近同事反映,在使用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: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 50 pts/3 00 grep pt-heartbeat

查看该进程的内存使用率

# top -p 1505

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

 

现关闭数据库

# service MysqLd stop

 

刚才的pt-heartbeat命令不断输出以下信息

 

同样cpu时间后,MEM增长到4.4%, 增长了1%,考虑到内存500M,该进程的内存占用增加了5M,虽然不是很多,但考虑到进程的内存增加并没有停止的意思,这个现象还是要引起注意的。

 

同时,通过pmap命令,发现,0000000001331000地址的RSS和Dirry也会增长,增长的速率是4k/s

 

后来研究pt-heartbeat的源码,才发现代码有点BUG

my $trIEs = 2;   while ( !$dbh && $trIEs-- ) {      PTDEBUG && _d($cxn_string,' ',$user,1)">$pass,1)">join(',map { "$_=>$defaults->{$_}" } keys %$defaults ));      $dbh = eval { DBI->connect() };      if ( !$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};         }         $trIEs ) {            dIE ;         }      }   }

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

 

但是,通过设置如下断点,发现当$trIEs为0时,if函数里面的PTDEBUG && _d("$EVAL_ERROR")语句能执行,但dIE函数就是没有抛出异常,并退出脚本

PTDEBUG && _d(); ) {    PTDEBUG && _d($EVAL_ERROR);     $EVAL_ERROR; }

 

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

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命令异常退出

“test:”就是加入的测试字符。

 

结论

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

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

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

最后,给percona官方提了个BUG

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

 

总结

以上是内存溢出为你收集整理的当master down掉后,pt-heartbeat不断重试会导致内存缓慢增长全部内容,希望文章能够帮你解决当master down掉后,pt-heartbeat不断重试会导致内存缓慢增长所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/1151569.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-31
下一篇2022-05-31

发表评论

登录后才能评论

评论列表(0条)

    保存