最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
当前位置: 首页 - 科技 - 知识百科 - 正文

当masterdown掉后,pt-heartbeat不断重试会导致内存缓慢增长的原因及解决办法

来源:懂视网 责编:小采 时间:2020-11-09 07:01:04
文档

当masterdown掉后,pt-heartbeat不断重试会导致内存缓慢增长的原因及解决办法

当masterdown掉后,pt-heartbeat不断重试会导致内存缓慢增长的原因及解决办法:最近同事反映,在使用pt-heartbeat监控主从复制延迟的过程中,如果master down掉了,则pt-heartbeat则会连接失败,但会不断重试。 重试本无可厚非,毕竟从使用者的角度来说,希望pt-heartbeat能不断重试,直到重新连接上数据库。但是,他们发现,不断的重试会
推荐度:
导读当masterdown掉后,pt-heartbeat不断重试会导致内存缓慢增长的原因及解决办法:最近同事反映,在使用pt-heartbeat监控主从复制延迟的过程中,如果master down掉了,则pt-heartbeat则会连接失败,但会不断重试。 重试本无可厚非,毕竟从使用者的角度来说,希望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: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%

现关闭数据库

# 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, ' ', $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命令异常退出

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

结论

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

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

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

最后,给percona官方提了个bug

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

以上所述是小编给大家介绍的当master down掉后,pt-heartbeat不断重试会导致内存缓慢增长的原因及解决办法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

您可能感兴趣的文章:

  • 详解spring boot使用@Retryable来进行重处理
  • Spring Cloud重试机制与各组件的重试总结
  • 详解Spring Cloud Zuul重试机制探秘
  • Java编程Retry重试机制实例详解
  • 声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文档

    当masterdown掉后,pt-heartbeat不断重试会导致内存缓慢增长的原因及解决办法

    当masterdown掉后,pt-heartbeat不断重试会导致内存缓慢增长的原因及解决办法:最近同事反映,在使用pt-heartbeat监控主从复制延迟的过程中,如果master down掉了,则pt-heartbeat则会连接失败,但会不断重试。 重试本无可厚非,毕竟从使用者的角度来说,希望pt-heartbeat能不断重试,直到重新连接上数据库。但是,他们发现,不断的重试会
    推荐度:
    • 热门焦点

    最新推荐

    猜你喜欢

    热门推荐

    专题
    Top