1. 程式人生 > >技術分享 | tcmalloc解決mysqld例項引發的cpu過高問題

技術分享 | tcmalloc解決mysqld例項引發的cpu過高問題

作者簡介

任坤,現居珠海,先後擔任專職 Oracle 和 MySQL DBA,現在主要負責 MySQL、mongoDB 和 Redis 維護工作。

背景

MySQL 版本:5.6.29,普通主從

OS:CentOS 6.8

最近一段時間線上某例項頻繁報警CPU飆高,每次都捕獲到同一種 SQL,結構如下:

select uid from test_history where cat_id = '99999' and create_time >= '2019-07-12 19:00:00.000' and uid in (......)

其中uid一次性會傳入上百個。

表結構為

Create Table: CREATE TABLE `test_history` (``
id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',``
cat_id` varchar(64) NOT NULL,``
uid` varchar(128) NOT NULL,``
msg` varchar(64) NOT NULL',``
create_time` datetime NOT NULL COMMENT '建立時間',``
PRIMARY KEY (`id`),``
UNIQUE KEY `idx_cat_uid` (`cat_id`,`uid`,`create_time`),``
KEY `idx__time` (`create_time`)``
) ENGINE=InnoDB AUTO_INCREMENT=***** DEFAULT CHARSET=utf8`

SQL 使用到了索引idx_msg_uid_time,單條執行可以秒級完成,但是併發執行會遭遇執行時間過長(超過1個小時)且CPU過高的問題。

診斷思路

mpstat -P ALL 1,檢視cpu使用情況,主要消耗在sys即os系統呼叫上

perf top,cpu主要消耗在_spin_lock

生成perf report檢視詳細情況

CPU主要消耗在mutex爭用上,說明有鎖熱點。

採用pt-pmp跟蹤mysqld執行情況,熱點主要集中在mem_heap_alloc和mem_heap_free上。

Pstack提供更詳細的API呼叫棧

#0 0x0000003e0caf80cf in __lll_unlock_wake_private () from /lib64/libc.so.6
#1 0x0000003e0ca7cf6a in _L_unlock_5936 () from /lib64/libc.so.6
#2 0x0000003e0ca78bbc in _int_free () from /lib64/libc.so.6
#3 0x000000000097dcb3 in mem_area_free(void*, mem_pool_t*) ()
#4 0x000000000097d2d2 in mem_heap_block_free(mem_block_info_t*, mem_block_info_t*) ()
#5 0x00000000009e6474 in row_vers_build_for_consistent_read(unsigned char const*, mtr_t*, dict_index_t*, unsigned long**, read_view_t*, mem_block_info_t**, mem_block_info_t*, unsigned char**) ()
#6 0x00000000009dce75 in row_search_for_mysql(unsigned char*, unsigned long, row_prebuilt_t*, unsigned long, unsigned long) ()
#7 0x0000000000939c95 in ha_innobase::index_read(unsigned char*, unsigned char const*, unsigned int, ha_rkey_function) ()

Innodb在讀取資料記錄時的API路徑為

row_search_for_mysql --》
row_vers_build_for_consistent_read --》
mem_heap_create_block_func --》
mem_area_alloc --》
malloc --》
_L_unlock_10151 --》
__lll_unlock_wait_private

row_vers_build_for_consistent_read會陷入一個死迴圈,跳出條件是該條記錄不需要快照讀或者已經從undo中找出對應的快照版本,每次迴圈都會呼叫mem_heap_alloc/free。

而該表的記錄更改很頻繁,導致其undo history list比較長,搜尋快照版本的代價更大,就會頻繁的申請和釋放堆記憶體。

Linux原生的記憶體庫函式為ptmalloc,malloc/free呼叫過多時很容易產生鎖熱點。

當多條 SQL 併發執行時,會最終觸發os層面的spinlock,導致上述情形。

解決方案

將mysqld的記憶體庫函式替換成tcmalloc,相比ptmalloc,tcmalloc可以更好的支援高併發呼叫。

修改my.cnf,新增如下引數並重啟

[mysqld_safe]
malloc-lib=tcmalloc

上週五早上7點執行的操作,到現在超過72小時,期間該例項沒有再出現cpu長期飆高的情形。

以下是修改前後cpu使用率對比

相關推薦

技術分享 | tcmalloc解決mysqld例項引發cpu問題

作者簡介 任坤,現居珠海,先後擔任專職 Oracle 和 MySQL DBA,現在主要負責 MySQL、mongoDB 和 Re

解決win7 svchost佔用CPU的問題

最近發現 工作管理員裡,  一個svchost.exe 總是佔著大量CPU,  以為中毒了。  經過排查,感覺是Windows Update 時刻佔用著這個程序, 造成不停地運算處理。 解決方法:   在工作管理員裡,右鍵佔用cpu最多的那個 svchost.exe -&

Mysql占用CPU如何優化,如何解決

lang 主服務器 disable mission 帳號 知識 用戶 clean oca 2017-02-28 15:13 331人閱讀 評論(0) 收藏 舉報 MySQL占用CPU過高如何優化 一次生產DB服務器的 超負荷運行問題解決: 1.查看生產

win10 解決 WMI Provider Host 占用CPU問題

log sdn tgw com win8.1 選擇 木馬 翻譯 event 真心懶得寫Blog,但是之前遇到這個問題在網上查了一大圈,幾乎一摸一樣都是讓關防火墻等服務的,然而對於我來說,並沒有毛線用。 無奈,直接去微軟社區查,還真有一篇問題解決方案。順手翻譯一下

win10 解決 WMI Provider Host 佔用CPU問題

      真心懶得寫Blog,但是之前遇到這個問題在網上查了一大圈,幾乎一摸一樣都是讓關防火牆等服務的,然而對於我來說,並沒有毛線用。 無奈,直接去微軟社群查,還真有一篇問題解決方案。順手翻譯一下放在這裡,希望能幫到大家。 參考連結:https://answers.m

tomcat占用cpu解決辦法

title 情況 處理 顯示 pri grep tar jstack 16進制 在工作中經常遇到tomcat占用cpu居高不下,針對這種情況有以下處理辦法進行排查。 jps --> 查看java的進程 top -Hp pid --> 根據jps得到的進程

Mysql佔用CPU如何優化,如何解決

 Mysql佔用CPU過高如何優化 一次生產DB伺服器的 超負荷執行問題解決: 1.檢視生產DB伺服器top列表, 執行 top 命令 檢視Cpu(s) 引數一直處於 98% 狀態 ,load average達到了 5  (4核伺服器) 可見DB已經超負荷運行了

mysql佔用伺服器cpu的原因以及解決辦法

排查方法 : > mysql -uroot -p      #登陸資料庫 >********       &n

IAStorDataMgrSvc.exe程序佔用cpu解決方法

dell電腦無任何讀寫操作,但IAStorDataMgrSvc.exe程序始終佔用40%~50% 的cpu,高cpu佔用,電腦操作不順暢。 這個程序一般都是驅動程式版本有問題!別以為電腦都已經是裝的最新版本的驅動了就覺得不會是這個問題,本人就是安裝官方推薦的

輕鬆解決mscorsvw.exe程序CPU佔用的問題

微軟剛剛推出Win7 SP1補丁包,筆者就在第一時間安裝了,想親身體驗一下SP1補丁包為Win7系統所帶來的新變化。但令人遺憾的是,剛剛安裝Win7 SP1補丁包後不久,系統的執行速度居然比原來慢了許多。開啟“Windows 工作管理員”視窗,卻看到新出現的mscorsvw程序的CPU佔有率已經達到了99

完美解決win7系統中IE佔用CPU問題(轉)

選中”Main“右側會顯示子內容。從中找到”TabProcGrowth“,並雙擊開啟,將數值資料設定為”0“或者”1“。TabProcGrowth賦值為1,則表示允許系統最多可允許IE出現兩個程序,如果賦值為0,則表示IE只能有一個程序。一般我們設定為”0“。

IIS的記憶體/CPU了應該如何解決

  一、發現程序中的w3wp佔用率過高。   經過查詢,發現如下:   w3wp.exe是在IIS(因特網資訊伺服器)與應用程式池相關聯的一個程序,如果你有多個應用程式池,就會有對應的多個w3wp.exe的程序例項執行。這個程序用來分配大量的系統資源。這個程序對於系統的穩定和安全具有重要的意義,不能輕易的

在windows平臺上解決oracle.exe的cpu使用的問題

mos文章: How to Diagnose High CPU Utilization of ORACLE.EXE in Windows Environment (文件 ID 273646.1) 請自行檢視,本文不做翻譯和轉載.

mysql佔用CPU解決辦法(新增索引)

下面是MYSQL佔用CPU高處理的一個例子,希望對遇到類似問題的朋友們有點啟發。一般來說MYQL佔用CPU高,多半是資料庫查詢程式碼問題,查詢資料庫過多。所以一方面要精簡程式碼,另一方面最好對頻繁使用的程式碼設定索引。 今天早上起來 機器報警 一查負載一直都在4以上

加一度分享解決競價推廣跳出率太的方法

重點 變化 解決方法 標記 ext 專家 設置 單獨 移動 競價推廣跳出率是指訪客只訪問了一個頁面便離開了網站,因而跳出率太高會導致有流量沒轉化,白白浪費錢。那麽如何降低跳出率,提高推廣效果成為競價員必須要解決的問題。 想要解決問題,先要找到原因。接下來,加一度將為競價員詳

linux下查找java進程占用CPU原因

jmeter 性能測試 linux下查找java進程占用CPU過高原因1. 查找進程top查看進程占用資源情況明顯看出java的兩個進程22714,12406占用過高cpu. 2.查找線程使用top -H -p <pid>查看線程占用情況 3.查找java的堆棧信息將線程id轉換成十六進制

elasticsearch CPU原因查找

elasticsearch CPU 今天稍微壓了了一下線上的ES集群,發現CPU 過高,線上用的是4核16G。 找到ES的進程14642, 執行 top -Hp 14642 選取其中一個過高的線程 jstack 14642 | grep -A 30 3989 發現 你也可以用 jstack 14

nginx系統占用CPU

阿裏 cpu高 pid 就是 tin nginx ret bject gin 一般來說,只要您的linux系統出現占用CPU資源高,或者占用內存多的放,都離不開php-cgi或php-fpm進程,當然,還有一個進程就是mysqld進程,遇到這樣的問題,如果對linux系統不

記一次jdbc連線oracle資料庫佔用CPU的問題排查

    背景:     公司有一個通訊系統,主要是通訊資料到客戶端程式所指定的資料庫,目前支援sqlserver、mysql和oracle三種類型的資料庫,此篇主要記錄一次oracle資料庫佔用CPU飆高的問題。   &nbs

weblogic下java程序占用cpu的問題排查

技術 .com htm http 執行命令 roo monitor The tin 1、cpu使用情況如圖: 2、執行命令 :jstack 126624 > cpu1112.log (註意執行此命令時的用戶需為執行進程的用戶,所以此處需要用weblogi