MySql CPU激增原因小結(jié)
QPS激增會(huì)導(dǎo)致CPU占用升高
分析
可以使用監(jiān)控工具,查看CPU利用率曲線圖和QPS曲線圖進(jìn)行對(duì)比。如果CPU曲線圖波動(dòng)情況跟QPS曲線圖波動(dòng)情況基本保持一致,可以明確明確CPU升高時(shí)QPS上升導(dǎo)致。反之,CPU曲線圖對(duì)比QPS曲線圖有不同步的峰值抖動(dòng),則說(shuō)明在QPS未明顯激增的情況下,CPU占用過(guò)高,則大概率跟慢SQL相關(guān),可進(jìn)行后續(xù)慢SQL的排查。
備注:如果沒(méi)有監(jiān)控工具協(xié)助分析的情況下,可以使用show global status like ‘Questions’ 和show global status like 'Uptime’查詢,將兩者相除得到就是QPS值。
show global status like 'Questions'; show global status like 'Uptime';
解決QPS激增:
- 判斷是否為實(shí)際業(yè)務(wù)激增導(dǎo)致,如果是實(shí)際業(yè)務(wù)激增導(dǎo)致,則可以通過(guò)資源擴(kuò)充,滿足業(yè)務(wù)激增的業(yè)務(wù)需求;
- 找到具體激增的查詢所對(duì)應(yīng)的應(yīng)用系統(tǒng)的接口,進(jìn)行限流控制,以保護(hù)數(shù)據(jù)庫(kù)并發(fā)訪問(wèn)量;
- 應(yīng)用采用讀寫(xiě)分離,降低單點(diǎn)訪問(wèn)壓力;
- 查看sql是否存在循環(huán)插入或者更新的情況,改為批量操作,減少執(zhí)行次數(shù)。
慢SQL會(huì)導(dǎo)致CPU升高
分析
通過(guò)show processlist查看當(dāng)前MySQL線程運(yùn)行情況,主要通過(guò) Time 連接時(shí)間和State當(dāng)前SQL所處的狀態(tài)來(lái)分析慢SQL,一般情況下如果存在Sending data說(shuō)明該查詢較慢,可以將info中的SQL復(fù)制出來(lái)通過(guò)explain查看詳細(xì)的執(zhí)行計(jì)劃進(jìn)行分析。
show processlist;
可通過(guò)MySql自帶的慢SQL日志功能分析:
通過(guò)root登錄數(shù)據(jù)庫(kù)開(kāi)啟慢SQL查詢?nèi)罩?,set global slow_query_log = ‘ON’,并設(shè)置慢SQL過(guò)濾時(shí)間set global long_query_time = 1(超過(guò)1秒視為慢SQL),指定慢SQL日志文件存放路徑set global slow_query_log_file = ‘/var/lib/mysql/test_1116.log’。通過(guò)持續(xù)觀察該慢SQL記錄日志文件,查找出具體的慢SQL復(fù)制出來(lái)通過(guò)explain查看詳細(xì)的執(zhí)行計(jì)劃進(jìn)行分析。
解決慢SQL:
- 緊急處理可以先通過(guò)殺死對(duì)應(yīng)線程(kill process id),緩解問(wèn)題;
- 無(wú)索引或者索引失效情況下,新建有效索引或者優(yōu)化SQL語(yǔ)句;
- SQL中有大量聚合操作:簡(jiǎn)化SQL,將邏輯提煉到業(yè)務(wù)代碼中;聚合操作異步或者預(yù)處理;
- SQL返回的數(shù)據(jù)過(guò)多,改為分頁(yè)查詢;
- 讀寫(xiě)較多鎖競(jìng)爭(zhēng)激烈,分庫(kù)分表或讀寫(xiě)分離。
大量空閑連接會(huì)導(dǎo)致CPU升高
show full processlist;
分析
通過(guò) show full processlist 查看Comand 有大量的Sleep,再根據(jù)Time查看裝填時(shí)間是否很長(zhǎng),如果存在大量長(zhǎng)時(shí)間睡眠線程占用數(shù)據(jù)庫(kù)連接,會(huì)導(dǎo)致數(shù)據(jù)庫(kù)的吞吐量下降,進(jìn)而導(dǎo)致阻塞也會(huì)引發(fā)CPU飄高的現(xiàn)象。
解決:
- 修改MySql配置文件中的 wait_timeout 空閑等待時(shí)間,值越小則相對(duì)空閑線程就會(huì)越少,不過(guò)需要重啟MySql才會(huì)生效;
- 通過(guò) set global wait_timeout = XX 方式熱修改該參數(shù)。
MySql 問(wèn)題排查常用命令
Sql執(zhí)行計(jì)劃,進(jìn)行sql執(zhí)行分析
explain + sql;
explain select * from user;
查看數(shù)據(jù)庫(kù)當(dāng)前執(zhí)行線程狀態(tài)
show full processlist;
其中重點(diǎn)字段包括Comand 、Time 、State、Info,可以查看當(dāng)前所有連接線程中命令、持續(xù)時(shí)間、狀態(tài)、對(duì)應(yīng)的SQL信息。
查詢當(dāng)前運(yùn)行的所有事物
select * from information_schema.INNODB_TRX ;
在執(zhí)行結(jié)果中可以看到是否有表鎖等待或者死鎖,如果有死鎖發(fā)生,可以通過(guò)下面的命令來(lái)殺掉當(dāng)前運(yùn)行的事務(wù):KILL trx_mysql_thread_id 。
查看當(dāng)前出現(xiàn)的鎖
select * from information_schema.INNODB_LOCKS;
在改結(jié)果中可以看到鎖的類型、所屬事務(wù)ID、鎖級(jí)別、鎖模式等信息。
查看死鎖
SELECT b.trx_state, e.state, e.time, d.state AS block_state, d.time AS block_time, a.requesting_trx_id, a.requested_lock_id, b.trx_query, b.trx_mysql_thread_id, a.blocking_trx_id, a.blocking_lock_id, c.trx_query AS block_trx_query, c.trx_mysql_thread_id AS block_trx_mysql_tread_id FROM information_schema.INNODB_LOCK_WAITS a LEFT JOIN information_schema.INNODB_TRX b ON a.requesting_trx_id = b.trx_id LEFT JOIN information_schema.INNODB_TRX c ON a.blocking_trx_id = c.trx_id LEFT JOIN information_schema.PROCESSLIST d ON c.trx_mysql_thread_id = d.id LEFT JOIN information_schema.PROCESSLIST e ON b.trx_mysql_thread_id = e.id ORDER BY a.requesting_trx_id;
查看InnoDB狀態(tài)
SHOW ENGINE INNODB STATUS;
到此這篇關(guān)于MySql CPU激增原因小結(jié)的文章就介紹到這了,更多相關(guān)MySql CPU激增原因內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL5.6 Replication主從復(fù)制(讀寫(xiě)分離) 配置完整版
這篇文章主要介紹了MySQL5.6 Replication主從復(fù)制(讀寫(xiě)分離) 配置完整版,需要的朋友可以參考下2016-04-04
MySQL中的物理存儲(chǔ)結(jié)構(gòu)詳解
這篇文章主要介紹了MySQL中的物理存儲(chǔ)結(jié)構(gòu)用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03
MySQL的一些功能實(shí)用的Linux shell腳本分享
這篇文章主要介紹了Linux系統(tǒng)下MySQL的一些實(shí)用功能的shell腳本分享,包括啟動(dòng)Memcached、binlog自動(dòng)清理和修復(fù)主從同步這樣三個(gè)簡(jiǎn)單的實(shí)例,需要的朋友可以參考下2015-12-12
Windows系統(tǒng)下MySQL8.0.21安裝教程(圖文詳解)
這篇文章主要介紹了Windows系統(tǒng)下MySQL8.0.21安裝教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
Mysql優(yōu)化調(diào)優(yōu)中兩個(gè)重要參數(shù)table_cache和key_buffer
這篇文章主要介紹了Mysql優(yōu)化調(diào)優(yōu)中兩個(gè)重要參數(shù)table_cache和key_buffer,需要的朋友可以參考下2014-12-12
新手入門(mén)Mysql--sql執(zhí)行過(guò)程
MySQL 是一種關(guān)系型數(shù)據(jù)庫(kù),在Java企業(yè)級(jí)開(kāi)發(fā)中非常常用,因?yàn)?MySQL 是開(kāi)源免費(fèi)的,并且方便擴(kuò)展MySQL是開(kāi)放源代碼的,因此任何人都可以在 GPL的許可下下載并根據(jù)個(gè)性化的需要對(duì)其進(jìn)行修改2021-06-06

