MySQL CPU 使用率高的原因和解決方法(來自aliyun官方文件)
使用者在使用 MySQL 例項時,會遇到 CPU 使用率過高甚至達到 100% 的情況。本文將介紹造成該狀況的常見原因以及解決方法,並通過 CPU 使用率為 100% 的典型場景,來分析引起該狀況的原因及其相應的解決方案。
常見原因
系統執行應用提交查詢(包括資料修改操作)時需要大量的邏輯讀(邏輯 IO,執行查詢所需訪問的表的資料行數),所以系統需要消耗大量的 CPU 資源以維護從儲存系統讀取到記憶體中的資料一致性。
說明:大量行鎖衝突、行鎖等待或後臺任務也有可能會導致例項的 CPU 使用率過高,但這些情況出現的概率非常低,本文不做討論。
本文通過一個簡化的模型來說明系統資源、語句執行成本以及 QPS(Query Per Second 每秒執行的查詢數)之間的關係:
條件:應用模型恆定(應用沒有修改)。
avg_lgc_io:執行每條查詢需要的平均邏輯 IO。
total_lgc_io:例項的 CPU 資源在單位時間內能夠處理的邏輯 IO 總量。
關係公式:
total_lgc_io = avg_lgc_io x QPS -- 單位時間 CPU 資源 = 查詢執行的平均成本 x 單位時間執行的查詢數量
解決方法
資料管理(DMS)工具提供了幾種輔助排查並解決例項效能問題的功能,主要有:
例項診斷報告
SQL 視窗提供的查詢優化建議和檢視執行計劃
例項會話
其中,例項診斷報告是排查和解決 MySQL 例項效能問題的最佳工具。無論何種原因導致的效能問題,建議您首先參考下例項診斷報告,尤其是診斷報告中的 SQL 優化、會話列表和慢 SQL 彙總分。
另外,如果您需要阿里雲的技術支援來解決 CPU 使用率高的狀況,請參見 https://market.aliyun.com/store/1682301.html。
避免出現 CPU 使用率達到 100% 的一般原則
設定 CPU 使用率告警,例項 CPU 使用率保證一定的冗餘度。
應用設計和開發過程中,要考慮查詢的優化,遵守 MySQL 優化的一般優化原則,降低查詢的邏輯 IO,提高應用可擴充套件性。
新功能、新模組上線前,要使用生產環境資料進行壓力測試(可以考慮使用阿里雲 PTS 壓力測試工具)。
新功能、新模組上線前,建議使用生產環境資料進行迴歸測試。
建議經常關注和使用 DMS 中的診斷報告。
注意:關於如何訪問 DMS 中的診斷報告,請參見 RDS 如何訪問診斷報告。
典型示例
以 CPU 使用率為 100% 的典型場景為例,本文介紹了兩個引起該狀況的原因及其解決方案,即應用負載(QPS)高和查詢執行成本(查詢訪問表資料行數 avg_lgc_io)高。其中,由於查詢執行成本高(查詢訪問表資料行數多)而導致例項 CPU 使用率高是 MySQL 非常常見的問題。
應用負載(QPS)高
現象描述
特徵:例項的 QPS(每秒執行的查詢次數)高,查詢比較簡單、執行效率高、優化餘地小。
表現:沒有出現慢查詢(或者慢查詢不是主要原因),且 QPS 和 CPU 使用率曲線變化吻合。
常見場景:該狀況常見於應用優化過的線上事務交易系統(例如訂單系統)、高讀取率的熱門 Web 網站應用、第三方壓力工具測試(例如 Sysbench)等。
解決方案
對於由應用負載高導致的 CPU 使用率高的狀況,使用 SQL 查詢進行優化的餘地不大,建議您從應用架構、例項規格等方面來解決,例如:
升級例項規格,增加 CPU 資源。
增加只讀例項,將對資料一致性不敏感的查詢(比如商品種類查詢、列車車次查詢)轉移到只讀例項上,分擔主例項壓力。
使用阿里雲 DRDS 產品,自動進行分庫分表,將查詢壓力分擔到多個 RDS 例項上。
使用阿里雲 Memcache 或者雲 Redis 產品,儘量從快取中獲取常用的查詢結果,減輕 RDS 例項的壓力。
對於查詢資料比較靜態、查詢重複度高、查詢結果集小於 1 MB 的應用,考慮開啟查詢快取(Query Cache)。
注意:能否從開啟查詢快取(Query Cache)中獲益需要經過測試,具體設定請參見 RDS for MySQL 查詢快取(Query Cache)的設定和使用。
定期歸檔歷史資料、採用分庫分表或者分割槽的方式減小查詢訪問的資料量。
儘量優化查詢,減少查詢的執行成本(邏輯 IO,執行需要訪問的表資料行數),提高應用可擴充套件性。
查詢執行成本(查詢訪問表資料行數 avg_lgc_io)高
現象描述
特徵:例項的 QPS(每秒執行的查詢次數)不高;查詢執行效率低、執行時需要掃描大量表中資料、優化餘地大。
表現:存在慢查詢,QPS 和 CPU 使用率曲線變化不吻合。
原因分析:由於查詢執行效率低,為獲得預期的結果即需要訪問大量的資料(平均邏輯 IO高),在 QPS 並不高的情況下(例如網站訪問量不大),就會導致例項的 CPU 使用率高。
解決方案
解決該狀況的原則是:定位效率低的查詢、優化查詢的執行效率、降低查詢執行的成本。
操作步驟
通過如下方式定位效率低的查詢:
若在 QPS 高導致 CPU 使用率高的場景中,查詢執行時間通常比較短,
show processlist;
命令或例項會話中可能會不容易捕捉到當前執行的查詢。您可以通過執行如下命令進行查詢:您可以通過執行類似
kill 101031643;
的命令來終止長時間執行的會話,終止會話請參見 RDS for MySQL 如何終止會話。關於長時間執行會話的管理,請參見 RDS for MySQL 管理長時間執行查詢通過
show processlist;
或show full processlist;
命令檢視當前執行的查詢,如下圖所示:對於查詢時間長、執行狀態(State 列)是“Sending data”、“Copying to tmp table”、“Copying to tmp table on disk”、“Sorting result”、“Using filesort”等都可能是有效能問題的查詢(SQL)。
注意:
通過 DMS 檢視當前執行的查詢,查詢步驟如下:
在 DMS 控制檯上登入資料庫。
選擇效能 > 例項會話,顯示結果如下圖所示:
從上圖可以看出,有 10 個會話在執行下面這個查詢:
單擊 SQL 列中的查詢文字,即可顯示完整的查詢和其執行計劃,如下圖所示:
從上圖可以看出,在該查詢的執行計劃中,系統對兩張約為 30 萬行的資料表執行了全表掃描。由於兩張表是聯接操作,這個查詢的執行成本(邏輯 IO)約為 298267 x 298839 = 89,133,812,013(大概 900 億),所以查詢會執行相當長的時間並且多個會話會導致例項 CPU 使用率達到 100%(對於同樣規格的例項,如果是優化良好的查詢,QPS 可以達到 21000;而當前 QPS 僅為 5)。
select b.* from perf_test_no_idx_01 a, perf_test_no_idx_02 b where a.created_on>= '2015-01-01' and a.detail= b.detail;
explain select b.* from perf_test_no_idx_01 a, perf_test_no_idx_02 b where a.created_on >=2015-01
相關推薦
MySQL CPU 使用率高的原因和解決方法(來自aliyun官方文件)
使用者在使用 MySQL 例項時,會遇到 CPU 使用率過高甚至達到 100% 的情況。本文將介紹造成該狀況的常見原因以及解決方法,並通過 CPU 使用率為 100% 的典型場景,來分析引起該狀況的原因及其相應的解決方案。 常見原因 系統執行應用提交查詢(包括資料修改操
c#Winform程式CPU佔用高的原因和解決方法
程式CPU佔用高的可能原因:1、存在死迴圈;為什麼死迴圈會導致CPU佔用高呢? 雖然分時作業系統是採用時間片的機制對CPU的時間進行管理的,也就是說到了一定時間它會自動從一個程序切換到下一個程序。但是,當進入別的程序後,若該程序告訴系統它現在不需要做什麼,不需要那麼
MySQL的Illegal mix of collationsy異常原因和解決方法
ear 代碼 clear 今天 tag 類型 資料 bsp net 原創 2008年12月25日 11:54:00 標簽: mysql / collation / character / variables / database / server 今天
mysql安裝不上怎麼辦 mysql安裝失敗原因和解決方法
困難1:MySQL 5.1 安裝過程中報apply security setting錯誤 1.解除安裝MySQL。 2.刪除目錄 C:\Documents and Settings\All Users\Application Data\MySQL。 3.重新安裝MySQL就OK啦。 困難2:MySQL提示C
mysql 直接從date 資料夾備份表,還原資料庫之後提示 table doesn`t exist的原因和解決方法
如型別是MyISAM, 資料檔案則以”Table.frm””Table.MYD””Table.MYI””三個檔案儲存於”/data/$databasename/”目錄中.如型別是InnoDB, 資料檔案則儲存在”$innodb_data_home_dir/″中的ibdat
總結-Mysql資料庫鎖表的原因和解決方法
鎖表的原因: 當多個連線(資料庫連線)同時對一個表的資料進行更新操作,那麼速度將會越來越慢,持續一段時間後將出現資料表被鎖的現象,從而影響到其它的查詢及更新。 例如: 儲存過程迴圈30次更新操作(cycore_file_id 為唯一標識) /*30
mysql主從同步延遲原因及解決方法
解決方案 數據庫 master 朋友 mysql MySQL主從延遲原因以及解決方案:談到MySQL數據庫主從同步延遲原理,得從mysql的數據庫主從復制原理說起,mysql的主從復制都是單線程的操作(mysql5.6版本之前),主庫對所有DDL和DML產生binlog,binlog是順序
angularJS報錯$apply already in progress的原因和解決方法
$apply eap module 關註 當前 typeof else ply 沒有 如果我們使用了AngularJS中的$scope.$apply()或者$scope.$digest(),我們很可能會遇到類似下面的錯誤,雖然這個錯誤沒有太大影響,但是在日誌中看起來還是很不
[python]命令窗口顯示不是內部或外部命令的原因和解決方法
命令 所在 dos 今天 屬性 add 系統 進入 文件 今天做習題時總是提示錯誤“不是內部或外部命令,也不是可運行的程序……” 於是上網搜索了一下出現這個錯誤的原因和解決方法,在此做個總結。 原因一:沒有設置PATH環境變量 Windows會根據設置的Path環境
關於網站開發中div標簽中設置寬度後其中文本溢出的原因和解決方法
lan 解析 info tro 情況 href targe 圖片 com 一.問題產生的原因 當我們為div標簽聲明了寬度,但是仍然會出現文本越界的情況,不知道大家有沒有發現,只有文本內容為單詞或者純數字 的時候才會出現這種情況為此我特意測試了兩種情況,結果如下:
WPF 程序無法觸摸操作?我們一起來找原因和解決方法!
line 坐標 團隊 github webkit pro rgba alter 徹底 原文:WPF 程序無法觸摸操作?我們一起來找原因和解決方法! 版權聲明:本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。歡
開啟網頁速度慢的原因和解決方法
開啟網頁打不開,開啟速度慢的原因和解決方法 1、原因一: 載入資源過多,http請求太多,佔用伺服器資源越多,時間越久,支援不了併發量,伺服器承受不了太多請求,開始丟棄部分資料,網頁無法開啟,報錯404 解決:減少http請求次數 2、原因二:接收資料時間過長,如下載資源過
Win10 開始運行不保存歷史記錄原因和解決方法
需要 regedit 方法 打開 搜索 選擇 設置 運行 一個 在Win10 1703的時候你也許會發現開始運行以後,再次打開就沒有任何歷史記錄了,常規方法是桌面-右鍵-個性化-開始-顯示最常用的應用..可是打開是灰色的不可選..其實這個問題很好解決,在win10 1506
ConcurrentModificationException: 集合異常——產生原因和解決方法!
:注意事項:迭代器在使用的時候,有人為了方便,如下使用就會有問題 System.out.println(((Student)it.next()).getName()+”---”+((Student)it.next()).getAge()); 注意事項:迭代器在使用的時候,有人為了方便,如下使
【夾娃系列】java面試基礎知識儲備(¥2)——JVM記憶體劃分和記憶體溢位異常的原因和解決方法
JVM記憶體劃分和記憶體溢位 JVM記憶體劃分 記憶體溢位的異常和解決辦法 JVM記憶體劃分 堆:存放物件例項,被所有的執行緒共享的一塊區域。垃圾收集器管理的主要區域。 方法區:儲存虛擬機器載入的類資訊,常量,靜態變
ConcurrentModificationException異常原因和解決方法
在前面一篇文章中提到,對Vector、ArrayList在迭代的時候如果同時對其進行修改就會丟擲java.util.ConcurrentModificationException異常。下面我們就來討論以下這個異常出現的原因以及解決辦法。 以下是本文目錄大綱: 一.Conc
原碼安裝MySQL時出現的問題和解決方法
原碼安裝MySQL時出現的問題和解決方法 1.配置檔案沒有修改 初始化資料庫資訊mysqld --initialize --user=mysqlmysqld --initialize --user=mysql 初始化資料庫目錄 初始化成功會生成 data 目錄,屬主為 my
在同一個類中,一個方法呼叫另外一個有註解(比如@Async,@Transational)的方法,註解失效的原因和解決方法
在同一個類中,一個方法呼叫另外一個有註解(比如@Async,@Transational)的方法,註解是不會生效的。 比如,下面程式碼例子中,有兩方法,一個有@Transational註解,一個沒有。如果呼叫了有註解的addPerson()方法,會啟動一個Transaction;如果呼叫updatePerso
Java ConcurrentModificationException異常原因和解決方法
在前面一篇文章中提到,對Vector、ArrayList在迭代的時候如果同時對其進行修改就會丟擲java.util.ConcurrentModificationException異常。下面我們就來討論以下這個異常出現的原因以及解決辦法。 一.Concur
如何用adb連線android手機?(我的親自經歷)------ 順便說說unable to connect to 192.168.1.100:5555的原因和解決方法
adb是什麼呢? 我就不多說了, 對於搞android開發的人來說, 一定不陌生。 本文講述如何用adb來連線手機。 利用adb來連線手機, 有兩種方式: 1, wifi, 2, usb. 前提條件: 下載adb, 最好把對應的檔案