1. 程式人生 > >MySQL CPU 使用率高的原因和解決方法(來自aliyun官方文件)

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 使用率高。

解決方案

解決該狀況的原則是:定位效率低的查詢、優化查詢的執行效率、降低查詢執行的成本。

操作步驟
  1. 通過如下方式定位效率低的查詢:

    • 若在 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 檢視當前執行的查詢,查詢步驟如下:

    1. 在 DMS 控制檯上登入資料庫

    2. 選擇效能 > 例項會話,顯示結果如下圖所示:

      DMS 檢視執行的查詢

      從上圖可以看出,有 10 個會話在執行下面這個查詢:


    3. 單擊 SQL 列中的查詢文字,即可顯示完整的查詢和其執行計劃,如下圖所示:

      查詢詳情

      從上圖可以看出,在該查詢的執行計劃中,系統對兩張約為 30 萬行的資料表執行了全表掃描。由於兩張表是聯接操作,這個查詢的執行成本(邏輯 IO)約為 298267 x 298839 = 89,133,812,013(大概 900 億),所以查詢會執行相當長的時間並且多個會話會導致例項 CPU 使用率達到 100%(對於同樣規格的例項,如果是優化良好的查詢,QPS 可以達到 21000;而當前 QPS 僅為 5)。

    4. 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;

    5. 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, 最好把對應的檔案