作為DBA工作中都會遇到過數據庫服務器CPU飆升的場景,我們該如何快速定位問題?又該如何快速找到具體是哪個SQL引發的CPU異常呢?下面我們說兩個方法。聊聊MySQL中如何快速定位占用CPU過高的SQL。
技術人人都可以磨煉,但處理問題的思路和角度各有不同,希望這篇文章可以拋磚引玉。
以一個例子為切入點
基礎環境:
- 主機類型:阿里云?
- 操作系統:CentOS release 7.4
- 存儲:Alibaba Cloud ECS ???
- 內存:64 G
- CPU型號:Intel(R) Xeon(R) Platinum 8163 CPU @ 2.50GHz ( 1 U * 8 core)?
- CPU核數:16CORE
- 數據庫環境:MySQL5.7.27
- 存儲引擎:InnoDB
問題現象:
數據庫服務器CPU飆升。
方案一、通過pidstat命令定位
?
首先我們先找到mysqld進程的PID,然后執行pidstat -t -p $PID,結果如下圖:
進入mysql交互命令,通過以下命令查詢具體SQL。
?select?*?from?performance_schema.threads?where?thread_os_id?=?'1';
定位到了具體定位sql接下來就可以分析優化了。
方案二、通過TOP命令定位
- 首先執行TOP命令,輸入H,可以按照顯示線程狀態。
- 輸入P,可以按照cpu的使用時間份額進行排序,這時候我們就可以看下是否有超過70%-90%以上的線程了。
?
登錄mysql,執行以下命令
select?*?from?performance_schema.threads?where?THREAD_OS_ID=4461?\G
更多精彩內容,關注我們▼▼