問題描述
阿里云云數據庫RDS MySQL/MariaDB版使用過程中,出現CPU使用率過高甚至達到100%的情況。
問題原因
應用提交查詢操作或數據修改操作時,系統需要執行大量的邏輯讀操作,其中邏輯IO包含執行查詢所需訪問表的數據行數。所以系統需要消耗大量的CPU資源以維護從存儲系統讀取到內存中的數據一致性。本文以CPU使用率為100%的場景為例,介紹了兩個引起該狀況的原因及其解決方案,即應用負載(QPS)高和慢SQL導致查詢成本高。其中由于慢SQL導致查詢成本高(查詢訪問表數據行數多),導致實例CPU使用率高是MySQL非常常見的問題。
大量行鎖沖突、行鎖等待或后臺任務導致實例CPU使用率過高的問題,由于出現的概率非常低,本文不做討論。
應用負載(QPS)高:
特征:實例的QPS高,查詢比較簡單,執行效率高,優化余地小。
表現:沒有出現慢查詢,或者慢查詢不是主要原因,且QPS和CPU使用率曲線變化吻合。
常見場景:該狀況常見于應用優化過的在線事務交易系統(例如訂單系統)、高讀取率的熱門Web網站應用、第三方壓力工具測試(例如Sysbench)等。
慢SQL導致查詢成本高(查詢訪問表數據行數多):
特征:實例的QPS不高,查詢執行效率低、執行時需要掃描大量表數據、優化余地大。
表現:存在慢查詢,QPS和CPU使用率曲線變化不吻合。
原因分析:由于查詢執行效率低,為獲得預期的結果需要訪問大量的數據導致平均邏輯IO高,因此在QPS并不高的情況下(例如網站訪問量不大),也會導致實例的CPU使用率偏高。
解決方案
根據您實際情況選擇對應的解決方法。
應用負載(QPS)高
對于因應用負載高導致CPU使用率高的狀況,使用SQL進行優化的余地不大,建議您從應用架構、實例規格等方面來處理問題。請參考以下方法:
升級實例規格,增加CPU資源,詳情請參見變更配置。
增加只讀實例,將對數據一致性不敏感的查詢(比如商品種類查詢、列車車次查詢)轉移到只讀實例上,分擔主實例壓力,詳情請參見創建MySQL只讀實例。
使用阿里云PolarDB-X云原生分布式數據庫,自動進行分庫分表,將查詢壓力分擔到多個RDS實例上。
使用阿里云云數據庫Memcache或者云數據庫 Tair(兼容 Redis),盡量從緩存中獲取常用的查詢結果,減輕RDS實例的壓力。
對于查詢數據比較靜態、查詢重復度高、查詢結果集小于1MB的應用,考慮開啟查詢緩存(Query Cache)。
說明能否從開啟查詢緩存(Query Cache)中獲益需要經過測試,具體設置請參見RDS MySQL查詢緩存(Query Cache)的設置和使用。
定期歸檔歷史數據、采用分庫分表或者分區的方式減小查詢訪問的數據量。盡量優化查詢,減少查詢的執行成本,提高應用可擴展性。
慢SQL導致查詢成本高
解決該問題的原則:定位效率低的查詢、優化查詢的執行效率、降低查詢執行的成本。
通過以下方式定位效率低的查詢:
執行以下SQL語句,查看當前執行的查詢語句。
show processlist; show full processlist;
系統顯示類似如下結果:
查詢時間長、運行狀態為Sending data、Copying to tmp table、Copying to tmp table on disk、Sorting result、Using filesort的查詢會話可能均包含性能問題。
若在QPS高導致CPU使用率高的場景中,查詢執行時間通常比較短,
show processlist;
命令或實例會話中可能會不容易捕捉到當前執行的查詢。但是您可以通過執行以下SQL語句進行查詢。explain [$SQL]
說明[$SQL]為有性能問題的SQL查詢語句。
您可以通過執行類似
kill [$ID];
的命令來終止長時間執行的會話,終止會話請參見RDS MySQL如何終止會話。說明[$ID]為該查詢語句對應的會話ID。
通過數據庫自治服務DAS查看當前執行的查詢:
登錄DAS控制臺。
依次單擊目標實例右側的
。單擊SQL列中的查詢文本,即可顯示完整的查詢和其執行計劃。
得到需要優化的查詢語句后,可以通過DMS控制臺上的SQL診斷來獲取優化建議。診斷報告同樣適用于排查歷史實例CPU使用率高的問題:
通過DMS控制臺登錄實例。
單擊頁面上方的SQL窗口,選擇對應的庫。
將查詢語句粘貼到SQL窗口,單擊SQL診斷,即可得到優化建議。
根據您實際情況,選擇優化建議進行處理。例如添加索引,確認執行查詢成本會大幅減少。
更多信息
性能問題排查并解決功能
數據管理工具提供了輔助排查并解決實例性能問題的功能,主要有以下幾種。其中,實例診斷報告是排查和解決MySQL/MariaDB實例性能問題的最佳工具。無論何種原因導致的性能問題,建議您首先查看實例診斷報告,尤其是診斷報告中的SQL優化、會話列表和慢SQL匯總。
避免出現CPU使用率達到100%的原則
如何避免CPU使用率達到100%的處理方法如下:
設置CPU使用率告警,保證實例CPU使用率有一定的冗余度。
應用設計和開發過程中,需要考慮查詢的優化,遵守MySQL優化的一般優化原則,降低查詢的邏輯IO,提高應用可擴展性。
新功能、新模塊上線前,需要使用生產環境數據進行壓力測試,建議使用阿里云性能測試PTS。
新功能、新模塊上線前,建議使用生產環境數據進行回歸測試。
建議經常關注和使用診斷報告功能,詳情請參見RDS訪問實例診斷報告。
系統資源算法
下文通過一個簡化的模型來說明系統資源、SQL語句執行成本以及QPS(Query Per Second每秒執行的查詢數)之間的關系:
條件:應用模型恒定,即應用沒有修改。
avg_lgc_io:執行每條查詢需要的平均邏輯IO。
total_lgc_io:實例的CPU資源在單位時間內能夠處理的邏輯IO總量。
關系公式:
total_lgc_io = avg_lgc_io × QPS
,即單位時間CPU資源總量 = 執行查詢的平均邏輯IO × 單位時間執行的查詢數量
。
相關文檔
利用CloudDBA解決MySQL實例CPU使用率過高的問題
適用于
云數據庫RDS MySQL版
云數據庫RDS MariaDB版