中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

【Mysql】主機(jī)cpu之-sys使用率過高

學(xué)習(xí)大神的http://mp.weixin.qq.com/s/hXtCzSnlVfo9Cq92538ipw自己整理一點思路
1.0top看cpu消耗,發(fā)現(xiàn)sys比usr要高不少,這非常不正常

目前創(chuàng)新互聯(lián)公司已為千余家的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管、綿陽服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計、高州網(wǎng)站維護(hù)等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

1.1使用pstack看 MySQL所有線程的調(diào)用棧:

InnoDB線程同步機(jī)制

我們知道linux線程同步有Mutex,spin lock,條件變量,rw lock等多種同步機(jī)制,InnoDB并沒有直接使用系統(tǒng)的同步機(jī)制,而是自己定義了互斥結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)kernel_mutex,將系統(tǒng)的spin lock,mutex,和條件變量融合一起

【Mysql】主機(jī)cpu 之-sys使用率過高

如圖,kernel_mutexmutex對象的中重要的結(jié)構(gòu)成員為os_event和lock_word。

  • kernel_mutex主要涉及mutex_create,mutex_enter,mutex_exit函數(shù),會分別使用glibc的malloc()和free()調(diào)用動態(tài)分配和釋放內(nèi)存

  • 封裝mutex和條件變量,圖中綠色框區(qū)域
    MySQL線程之間發(fā)送異步信號來進(jìn)行同步主要通過os_event_struct結(jié)構(gòu)體中的os_mutex(封裝os的pthread_mutex_t)和cond_var(封裝os的pthread_cond_t)成員對象實現(xiàn)。當(dāng)InnoDB在獲取鎖的時候,首先先努力自旋一段時間,如果超過innodb_sync_spin_loops的閾值,就會通過函數(shù)os_event_wait_low()在os_event_struct->cond_var上等待。如圖,當(dāng)某個線程釋放了鎖的時候,通過os_cond_broadcast嘗試發(fā)送廣播喚醒所有等待os_event_struct->cond_var條件變量的線程.這些線程被喚醒后又繼續(xù)競爭爭搶os_event_struct->os_mutex

  • spin lock,圖中黃色框區(qū)域
    通過lock_word做spin wait。線程想要爭搶鎖的時候先判斷這個值,如果lock_word為1就繼續(xù)自旋等待。如果發(fā)現(xiàn)其他線程釋放了鎖該值變?yōu)?的時候,就通過test_and_set改為1,"告訴"其他線程這把鎖被持有了

InnoDB這樣設(shè)計的目的都是延緩線程被掛起并進(jìn)入os wait的速度,因為每一次進(jìn)入os wait等待被喚醒或者喚醒都會進(jìn)行一次上下文切換.但是也只能是延緩,并不能阻止,如果持續(xù)惡化得不到環(huán)境,最后仍然會進(jìn)入os的等待隊列,將會產(chǎn)生大量的上下文切換。但是有兩個問題:

  • kernel_mutex是個全局鎖,保護(hù)事務(wù),buffer pool,鎖,等InnoDB存儲引擎實現(xiàn)的大部分對象.當(dāng)MySQL突然有大量訪問,并發(fā)一旦非常高的時候,mutex沖突非常劇烈,此時臨界區(qū)變得非常大,同時也會浪費cpu很多時間空轉(zhuǎn)。所以這也解釋了sys cpu大量消耗在自選空轉(zhuǎn)中

  • 并且并發(fā)高的時候會頻繁調(diào)用malloc()申請內(nèi)存,而glibc本身的malloc()本書頻繁調(diào)用系統(tǒng)mutex_lock()和unlock(),在多線程高并發(fā)場景下并且資源不足的場景下,也會造成系統(tǒng)各種mutex競爭嚴(yán)重。大量線程被掛起等待os pthread_cond_broadcast廣播被喚醒,隨之而來的是大量的上下文切換

通過dstat看到此時cpu每秒有近20W次的上下文切換,綜上所述,sys cpu負(fù)載高主要以下:

  • (1)cpu內(nèi)核態(tài)spin,大量線程cpu在內(nèi)核態(tài)自旋等待

  • (2)系統(tǒng)上下文切換,又分為:

    • spin仍然失敗的,最終進(jìn)入os wait,調(diào)用pthread_cond_wait等待條件滿足時被喚醒

    • malloc()頻繁加減os mutex,且系統(tǒng)內(nèi)存緊張


1.3繼續(xù)觀察內(nèi)存分配使用的情況.
sar -B 看內(nèi)存頁回收,其中pgscank/s,對應(yīng)kswapd回收,pgscand/s對應(yīng)的MySQL線程直接回收
【Mysql】主機(jī)cpu 之-sys使用率過高

pgscand/s不為0,說明內(nèi)存資源緊張,MySQL直接回收內(nèi)存。

可是free命令看內(nèi)存free并沒有用光。經(jīng)過一番調(diào)查發(fā)現(xiàn)是numa搞的鬼
用numactl --hardware命令看:

available: 2 nodes (0-1)
node 0 cpus: 0 1 2 3node 0 size: 32733 MB
node 0 free: 1900 MB
node 1 cpus: 4 5 6 7node 1 size: 32768 MB
node 1 free: 20 MB
node distances:
node   0   1  0:  10  20  1:  20  10 

雖然內(nèi)存整體free沒有用光,但是在numa默認(rèn)的內(nèi)存分配機(jī)制下,內(nèi)存使用嚴(yán)重不均,node0還十分充足,但是node1幾乎用光

還可以使用strace來診斷!

https://huoding.com/2015/10/16/474

文章標(biāo)題:【Mysql】主機(jī)cpu之-sys使用率過高
網(wǎng)頁URL:http://www.rwnh.cn/article16/jihddg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作虛擬主機(jī)、定制網(wǎng)站、營銷型網(wǎng)站建設(shè)、品牌網(wǎng)站建設(shè)企業(yè)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名
水富县| 四平市| 宿迁市| 仪征市| 武汉市| 资源县| 凌海市| 榕江县| 炎陵县| 佛坪县| 孝昌县| 从江县| 武城县| 贵定县| 四会市| 中超| 霍山县| 元谋县| 巴彦县| 嘉善县| 宜良县| 鄂伦春自治旗| 扎囊县| 奉节县| 深泽县| 白沙| 琼海市| 丘北县| 金门县| 文登市| 桦川县| 米脂县| 临漳县| 台江县| 湾仔区| 藁城市| 利辛县| 阿巴嘎旗| 普兰县| 南陵县| 上杭县|