亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》
  • 首頁 > 
  • 教程 > 
  • 數據庫 > 
  • 當master down掉后pt-heartbeat不斷重試會導致內存緩慢增長的原因及解決辦法

當master down掉后pt-heartbeat不斷重試會導致內存緩慢增長的原因及解決辦法

發布時間:2021-11-30 19:36:01 來源:億速云 閱讀:137 作者:柒染 欄目:數據庫

當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-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

查看該進程的內存使用率

# 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的版本有關。

很好奇,失敗的連接如何導致內存的不斷增長?

看完上述內容,你們掌握當master down掉后,pt-heartbeat不斷重試會導致內存緩慢增長的原因及解決辦法的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

雷州市| 河南省| 八宿县| 灵山县| 河津市| 鹤岗市| 通化县| 孙吴县| 平陆县| 中西区| 建水县| 麻江县| 桃园县| 德钦县| 兴国县| 靖边县| 莱芜市| 武夷山市| 景泰县| 纳雍县| 定兴县| 静海县| 得荣县| 苏尼特右旗| 楚雄市| 贡嘎县| 阿克苏市| 讷河市| 清新县| 石屏县| 林州市| 介休市| 庆云县| 茂名市| 皋兰县| 古交市| 井冈山市| 长白| 红原县| 错那县| 大悟县|