當master down失落後,pt-heartbeat赓續重試會招致內存遲緩增加的緣由及處理方法。本站提示廣大學習愛好者:(當master down失落後,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: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赓續重試會招致內存遲緩增加的緣由及處理方法,願望對年夜家有所贊助,假如年夜家有任何疑問迎接給我留言,小編會實時答復年夜家的!