mysql數(shù)據(jù)庫(kù)導(dǎo)致cpu過(guò)高一般從執(zhí)行狀態(tài)分析:
執(zhí)行狀態(tài)分析
Sleep狀態(tài)
通常代表資源未釋放,如果是通過(guò)連接池,sleep狀態(tài)應(yīng)該恒定在一定數(shù)量范圍內(nèi)
實(shí)戰(zhàn)范例:因前端數(shù)據(jù)輸出時(shí)(特別是輸出到用戶終端)未及時(shí)關(guān)閉數(shù)據(jù)庫(kù)連接,導(dǎo)致因網(wǎng)絡(luò)連接速度產(chǎn)生大量sleep連接,在網(wǎng)速出現(xiàn)異常時(shí),數(shù)據(jù)庫(kù)too many connections掛死。
簡(jiǎn)單解讀,數(shù)據(jù)查詢和執(zhí)行通常只需要不到0.01秒,而網(wǎng)絡(luò)輸出通常需要1秒左右甚至更長(zhǎng),原本數(shù)據(jù)連接在0.01秒即可釋放,但是因?yàn)榍岸顺绦蛭磮?zhí)行close操作,直接輸出結(jié)果,那么在結(jié)果未展現(xiàn)在用戶桌面前,該數(shù)據(jù)庫(kù)連接一直維持在sleep狀態(tài)!
Waiting for net, reading from net, writing to net
偶爾出現(xiàn)無(wú)妨
如大量出現(xiàn),迅速檢查數(shù)據(jù)庫(kù)到前端的網(wǎng)絡(luò)連接狀態(tài)和流量
案例:因外掛程序,內(nèi)網(wǎng)數(shù)據(jù)庫(kù)大量讀取,內(nèi)網(wǎng)使用的百兆交換迅速爆滿,導(dǎo)致大量連接阻塞在waiting for net,數(shù)據(jù)庫(kù)連接過(guò)多崩潰
Locked狀態(tài)
有更新操作鎖定
通常使用innodb可以很好的減少locked狀態(tài)的產(chǎn)生,但是切記,更新操作要正確使用索引,即便是低頻次更新操作也不能疏忽。如上影響結(jié)果集范例所示。
在myisam的時(shí)代,locked是很多高并發(fā)應(yīng)用的噩夢(mèng)。所以mysql官方也開(kāi)始傾向于推薦innodb。
Copy to tmp table
索引及現(xiàn)有結(jié)構(gòu)無(wú)法涵蓋查詢條件,才會(huì)建立一個(gè)臨時(shí)表來(lái)滿足查詢要求,產(chǎn)生巨大的恐怖的i/o壓力。
很可怕的搜索語(yǔ)句會(huì)導(dǎo)致這樣的情況,如果是數(shù)據(jù)分析,或者半夜的周期數(shù)據(jù)清理任務(wù),偶爾出現(xiàn),可以允許。頻繁出現(xiàn)務(wù)必優(yōu)化之。
Copy to tmp table通常與連表查詢有關(guān),建議逐漸習(xí)慣不使用連表查詢。
實(shí)戰(zhàn)范例:
u 某社區(qū)數(shù)據(jù)庫(kù)阻塞,求救,經(jīng)查,其服務(wù)器存在多個(gè)數(shù)據(jù)庫(kù)應(yīng)用和網(wǎng)站,其中一個(gè)不常用的小網(wǎng)站數(shù)據(jù)庫(kù)產(chǎn)生了一個(gè)恐怖的copy to tmp table操作,導(dǎo)致整個(gè)硬盤i/o和cpu壓力超載。Kill掉該操作一切恢復(fù)。
Sending data
Sending data并不是發(fā)送數(shù)據(jù),別被這個(gè)名字所欺騙,這是從物理磁盤獲取數(shù)據(jù)的進(jìn)程,如果你的影響結(jié)果集較多,那么就需要從不同的磁盤碎片去抽取數(shù)據(jù),
偶爾出現(xiàn)該狀態(tài)連接無(wú)礙。
回到上面影響結(jié)果集的問(wèn)題,一般而言,如果sending data連接過(guò)多,通常是某查詢的影響結(jié)果集過(guò)大,也就是查詢的索引項(xiàng)不夠優(yōu)化。
如果出現(xiàn)大量相似的SQL語(yǔ)句出現(xiàn)在show proesslist列表中,并且都處于sending data狀態(tài),優(yōu)化查詢索引,記住用影響結(jié)果集的思路去思考。
Storing result to query cache
出現(xiàn)這種狀態(tài),如果頻繁出現(xiàn),使用set profiling分析,如果存在資源開(kāi)銷在SQL整體開(kāi)銷的比例過(guò)大(即便是非常小的開(kāi)銷,看比例),則說(shuō)明query cache碎片較多
使用flush query cache可即時(shí)清理,也可以做成定時(shí)任務(wù)
Query cache參數(shù)可適當(dāng)酌情設(shè)置。
Freeing items
理論上這玩意不會(huì)出現(xiàn)很多。偶爾出現(xiàn)無(wú)礙
如果大量出現(xiàn),內(nèi)存,硬盤可能已經(jīng)出現(xiàn)問(wèn)題。比如硬盤滿或損壞。
i/o壓力過(guò)大時(shí),也可能出現(xiàn)Free items執(zhí)行時(shí)間較長(zhǎng)的情況。
Sorting for …
和Sending data類似,結(jié)果集過(guò)大,排序條件沒(méi)有索引化,需要在內(nèi)存里排序,甚至需要?jiǎng)?chuàng)建臨時(shí)結(jié)構(gòu)排序。
其他