国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > SQL Server > 正文

當(dāng)master down掉后,pt-heartbeat不斷重試會導(dǎo)致內(nèi)存緩慢增長的原因及解決辦法

2024-08-31 01:04:13
字體:
供稿:網(wǎng)友

最近同事反映,在使用pt-heartbeat監(jiān)控主從復(fù)制延遲的過程中,如果master down掉了,則pt-heartbeat則會連接失敗,但會不斷重試。

重試本無可厚非,畢竟從使用者的角度來說,希望pt-heartbeat能不斷重試,直到重新連接上數(shù)據(jù)庫。但是,他們發(fā)現(xiàn),不斷的重試會帶來內(nèi)存的緩慢增長。

重現(xiàn)

環(huán)境:

pt-heartbeat v2.2.19,MySQL社區(qū)版 v5.6.31,Perl v5.10.1,RHEL 6.7,內(nèi)存500M

為了避免數(shù)據(jù)庫啟停對pt-heartbeat內(nèi)存使用率的影響,故MySQL和pt-heartbeat分別運(yùn)行在不同的主機(jī)上。

運(yùn)行pt-heartbeat

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

監(jiān)控pt-heartbeat的內(nèi)存使用率

獲取pid

# ps -ef |grep pt-heartbeatroot 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-tableroot 1563 1545 2 19:50 pts/3 00:00:00 grep pt-heartbeat

查看該進(jìn)程的內(nèi)存使用率

# top -p 1505

運(yùn)行了0:15.00(TIME+列),MEM一直穩(wěn)定在3.3%

heartbeat

現(xiàn)關(guān)閉數(shù)據(jù)庫

# service mysqld stop

剛才的pt-heartbeat命令不斷輸出以下信息

heartbeat

同樣CPU時間后,MEM增長到4.4%, 增長了1%,考慮到內(nèi)存500M,該進(jìn)程的內(nèi)存占用增加了5M,雖然不是很多,但考慮到進(jìn)程的內(nèi)存增加并沒有停止的意思,這個現(xiàn)象還是要引起注意的。

heartbeat

同時,通過pmap命令,發(fā)現(xiàn),0000000001331000地址的RSS和Dirry也會增長,增長的速率是4k/s

heartbeat

后來研究pt-heartbeat的源碼,才發(fā)現(xiàn)代碼有點(diǎn)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函數(shù),用于獲取數(shù)據(jù)庫的連接,如果獲取失敗,則重試1次,然后通過die函數(shù)拋異常退出。

但是,通過設(shè)置如下斷點(diǎn),發(fā)現(xiàn)當(dāng)$tries為0時,if函數(shù)里面的PTDEBUG && _d("$EVAL_ERROR")語句能執(zhí)行,但die函數(shù)就是沒有拋出異常,并退出腳本

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

后來,將上述代碼的最后一個if函數(shù)修改如下:

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

再次測試

啟動數(shù)據(jù)庫

# service mysqld start

執(zhí)行pt-heartbeat命令

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

停止數(shù)據(jù)庫

# service mysqld stop

剛才執(zhí)行的pt-heartbeat命令異常退出

heartbeat

“test:”就是加入的測試字符。

結(jié)論

很奇怪,只是單純的die $EVAL_ERROR不會拋出異常,并退出腳本,但修改后的die "test:$EVAL_ERROR"卻會退出腳本。

很顯然,這確實(shí)是個bug,不知道是不是與perl的版本有關(guān)。

很好奇,失敗的連接如何導(dǎo)致內(nèi)存的不斷增長?

最后,給percona官方提了個bug

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

以上所述是小編給大家介紹的當(dāng)master down掉后,pt-heartbeat不斷重試會導(dǎo)致內(nèi)存緩慢增長的原因及解決辦法,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復(fù)大家的!


注:相關(guān)教程知識閱讀請移步到MSSQL教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 兴安县| 穆棱市| 息烽县| 讷河市| 措勤县| 舞阳县| 防城港市| 彰武县| 荥经县| 秦皇岛市| 儋州市| 迁西县| 吐鲁番市| 忻城县| 辽源市| 江口县| 横峰县| 浮梁县| 乌兰察布市| 新晃| 衡阳市| 平邑县| 建始县| 三都| 通州区| 长寿区| 孝昌县| 富蕴县| 栾城县| 互助| 曲水县| 新乡市| 天等县| 边坝县| 晴隆县| 沅江市| 高邮市| 台北县| 吴忠市| 普定县| 泸水县|