程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> 當master down掉後,pt-heartbeat不時重試會招致內存遲緩增長的緣由及處理方法

當master down掉後,pt-heartbeat不時重試會招致內存遲緩增長的緣由及處理方法

編輯:MSSQL

當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不時重試會招致內存遲緩增長的緣由及處理方法,希望對大家有所協助,假如大家有任何疑問歡送給我留言,會及時回復大家的!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved