跳至內容

如何疑難排解並解決 Amazon RDS for MySQL 或 Aurora MySQL 相容資料庫執行個體的 CPU 高使用率的問題?

4 分的閱讀內容
0

我的 Amazon Relational Database Service (Amazon RDS) for MySQL 資料庫執行個體或 Amazon Aurora MySQL 相容版執行個體的 CPU 使用率很高。

簡短描述

有許多因素可能會導致 CPU 使用率增加,例如使用者啟動的繁重工作負載、多個並行查詢或長時間執行的交易。

若要確定資料庫執行個體中 CPU 使用率的來源,請檢查下列資源:

  • 增強型監控
  • 效能洞察
  • 用於偵測工作負載中 CPU 使用率的產生原因的查詢
  • 具有已啟用監控的日誌

找出來源之後,分析並最佳化您的工作負載以減少 CPU 使用量。

解決方法

使用增強型監控

增強的監控提供作業系統 (OS) 層級檢視,以識別 CPU 負載高原因。例如,您可以檢閱負載平均值、作業系統處理程序清單和 CPU 分佈 (System (%)Nice (%))。

使用增強型監控,以使用 1、5 和 15 分鐘的間隔檢查 loadAverageMinute 資料。平均負載大於 vCPU 數量,即表示執行個體負載過重。如果負載平均值小於資料庫執行個體類別的 vCPU 數量,則 CPU 限流可能不會導致應用程式延遲。為避免在診斷 CPU 使用率原因時出現誤判,請檢查負載平均值。

例如,您有一個使用 db.m5.2xlarge 執行個體類別的資料庫執行個體,並且它達到了 CPU 限制。此執行個體類別有 8 個與之關聯的 vCPU。負載平均值超過 170 表示機器在測量的時間範圍內處於重負載狀態:

負載平均分鐘數:

  • 十五: 170.25
  • 五: 391.31
  • 一: 596.74

CPU 使用率:

  • 使用者 (%): 0.71
  • 系統 (%): 4.9
  • 良好 (%): 93.92
  • 總計 (%): 99.97

**注意:**Amazon RDS 為您的工作負載提供比在資料庫執行個體上執行的其他任務更高的優先順序。為了優先處理與管理相關的任務,工作負載任務具有不同的 Nice 值。因此,在增強型監控中,良好 (%) 代表您的工作負載對資料庫使用的 CPU 數量。

開啟增強型監控後,請檢查與資料庫執行個體相關聯的作業系統程序清單。增強型監控最多顯示 100 個處理程序。此清單可以幫助您識別對 CPU 和記憶體效能影響最大的處理程序。

在增強型監控的作業系統處理程序清單章節中,檢閱作業系統處理程序RDS 處理程序。這些指標可以幫助您確認作業系統或 RDS 處理程序是否增加了 CPU 使用率。或者,使用這些指標來監控 mysqldaurora 處理程序所使用的 CPU 百分比。如果 Aurora Storage Daemon 在 Aurora 執行個體上顯示高 CPU 使用率,表示該執行個體有大量的讀取/寫入工作負載。高 CPU 使用率也可能表示目前的執行個體規模對應現有儲存容量與工作負載過小。或者,背景中有複雜操作正在執行。

若要查看 CPU 使用率的分割,請檢閱 cpuUtilization 的指標。如需更多詳細資訊,請參閱使用增強型監控來監控作業系統指標

**注意:**如果您啟用「效能模式」,則只能將作業系統執行緒 ID 對應到 RDS MySQL 資料庫執行個體的處理程序 ID。您無法將作業系統執行緒 ID 對應到 Aurora MySQL 資料庫執行個體的處理程序 ID。如需更多詳細資訊,請參閱為什麼 Amazon RDS 資料庫執行個體在我具有足夠的記憶體時使用交換記憶體?

使用 Database Insights

重要:Performance Insights 將於 2025 年 11 月 30 日終止服務。您可以在 2025 年 11 月 30 日之前升級到 Database Insights 的進階模式。如果不升級,則使用 Performance Insights 的資料庫叢集將預設為 Database Insights 的標準模式。只有 Database Insights 的進階模式才支援執行計畫和隨需分析。如果您的叢集預設為標準模式,那麼您可能無法在主控台上使用這些功能。若要啟用進階模式,請參閱在 Amazon RDS 中啟用 Database Insights 進階模式。另請參閱在 Amazon Aurora 中啟用 Database Insights 進階模式

您可以使用 Database Insights 來識別在資料庫執行個體上執行並導致高 CPU 使用率的查詢。

首先,在您的 MySQL 執行個體上啟用 Database Insights。然後,使用 Database Insights 來最佳化您的工作負載。您也可以與資料庫管理員合作找出問題的根本原因。

如需引擎、AWS 區域及執行個體類別支援的更多資訊,請參閱支援 Database Insights 的 Aurora 資料庫引擎、區域與執行個體類型。另請參閱支援 Database Insights 的 Amazon RDS 資料庫引擎、區域與執行個體類別

使用查詢來偵測工作負載中 CPU 使用率的產生原因

您必須先識別有問題的查詢,然後才能最佳化工作負載。若要確定 CPU 使用率的根本原因,請在出現高 CPU 問題時執行下列查詢。

若要查看 MySQL 執行個體上執行的執行緒,請執行 SHOW FULL PROCESSLIST 命令:

SHOW FULL PROCESSLIST;

**注意:**以主要系統使用者身分執行 SHOW PROCESSLIST 查詢。您必須擁有 MySQL PROCESS 伺服器管理權限,才能查看在 MySQL 執行個體上執行的所有執行緒。如果沒有管理權限,SHOW PROCESSLIST 只會顯示與您所使用 MySQL 帳戶關聯的執行緒。

有時,同一組陳述式可能會繼續執行而未完成。發生這種情況時,後續陳述式必須等待第一組陳述式完成。這是因為 InnoDB 資料列層級鎖定可能正在更新相同的資料列。如需詳細資訊,請參閱 MySQL 網站上的 SHOW PROCESSLIST 陳述式

INNODB_TRX 表提供所有正在執行且非唯讀的 InnoDB 交易相關資訊。若要查看 INNODB_TRX 表,請執行下列查詢:

SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;

INNODB_LOCKS 表提供有關 InnoDB 交易所請求但尚未獲得的鎖定資訊。若要查看 INNODB_LOCKS 表,請執行下列查詢:

MySQL 5.7 或更早版本:

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;

MySQL 8.0:

SELECT * FROM performance_schema.data_locks;

如需更多詳細資訊,請參閱 MySQL 網站上的 MySQL 5.7 章節 24.4.14 INFORMATION_SCHEMA.INNODB_LOCKS 資料表和 MySQL 8.0 章節 data_locks 資料表

INNODB_LOCK_WAITS 資料表為每個已封鎖的 InnoDB 交易提供一或多個資料列。若要檢視 INNODB_LOCKS_WAITS 資料表,請執行下列查詢。

MySQL 5.7 或更早版本:

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

MySQL 8.0:

SELECT * FROM performance_schema.data_lock_waits;

若要查看正在等待的交易,以及正在封鎖等待交易的交易,請執行類似於下列範例的查詢:

MySQL 5.7 或更早版本:

SELECT  r.trx_id waiting_trx_id,
  r.trx_mysql_thread_id waiting_thread,  
  r.trx_query waiting_query,  
  b.trx_id blocking_trx_id,  
  b.trx_mysql_thread_id blocking_thread,  
  b.trx_query blocking_query  
FROM       information_schema.innodb_lock_waits w  
INNER JOIN information_schema.innodb_trx b  
  ON b.trx_id = w.blocking_trx_id  
INNER JOIN information_schema.innodb_trx r  
  ON r.trx_id = w.requesting_trx_id;

MySQL 8.0:

SELECT  r.trx_id waiting_trx_id,
  r.trx_mysql_thread_id waiting_thread,  
  r.trx_query waiting_query,  
  b.trx_id blocking_trx_id,  
  b.trx_mysql_thread_id blocking_thread,  
  b.trx_query blocking_query  
FROM       performance_schema.data_lock_waits w  
INNER JOIN information_schema.innodb_trx b  
  ON b.trx_id = w.blocking_engine_transaction_id  
INNER JOIN information_schema.innodb_trx r  
  ON r.trx_id = w.requesting_engine_transaction_id;

若要解釋此查詢的輸出,請參閱 MySQL 網站上的 MySQL 8.0 章節使用 InnoDB 交易和鎖定資訊

若要從標準 InnoDB 監視器取得有關 InnoDB 儲存引擎狀態的資訊,請執行下列查詢:

SHOW ENGINE INNODB STATUS;

如需詳細資訊,請參閱 MySQL 網站上的 MySQL 8.0 章節 SHOW ENGINE 陳述式

若要檢視伺服器狀態,請執行下列命令。

SHOW GLOBAL STATUS;

如需詳細資訊,請參閱 MySQL 網站上的 MySQL 8.0 章節 SHOW STATUS 陳述式

若要檢查歷史記錄清單長度 (HLL),請執行下列命令:

select NAME AS RollbackSegmentHistoryListLength, COUNT from INFORMATION_SCHEMA.INNODB_METRICS where NAME = 'trx_rseg_history_len';

如果您的工作負載需要多個開放或長時間執行的交易,那麼您的資料庫可能會具有較高的 HLL。另外,如果清除執行緒無法跟上資料庫的變更,則可能會導致 HLL 偏高。HLL 偏高會導致資源使用率增加,並使 SELECT 陳述式的效能變慢且不穩定。

在 Aurora MySQL 寫入執行個體上,使用 RollbackSegmentHistoryListLength CloudWatch 指標來監控您的 HLL。

如果執行個體的 HLL 偏高,請檢查您的 SQL 陳述式。當您執行 START TRANSACTION 但未執行 COMMIT 時,就會發生此問題。由於該執行緒進入 SLEEP (休眠) 狀態,您無法查看先前的 SQL 陳述式。

若要解決此問題,請執行以下命令。

SELECT event_id, current_schema, sql_text, lock_time
 FROM performance_schema.events_statements_history
 WHERE thread_id=<thread_id>  
 ORDER BY event_id DESC;

分析日誌並開啟監控

分析 MySQL 一般查詢日誌,以查看 mysqld 在特定時間執行的操作。您也可以查看特定時間在執行個體上執行的查詢,例如有關用戶端何時連線或中斷連線的資訊。如需詳細資訊,請參閱 MySQL 網站上的一般查詢日誌

**重要:**當您長時間啟用一般查詢日誌時,日誌會消耗儲存空間並增加效能負荷。

分析 MySQL 慢速查詢日誌,找出執行時間超過您在 long_query_time 所設定秒數的查詢。您也可以檢閱工作負載並分析查詢,以提高效能並減少記憶體耗用。如需更多詳細資訊,請參閱 MySQL 網站上的 7.4.5 慢速查詢日誌

**注意:**使用慢查詢日誌或一般查詢日誌時,最佳做法是將參數 log_output 設定為 FILE

使用 MariaDB Audit Plugin 來稽核 Amazon RDS for MySQL 或 Amazon RDS for MariaDB 上的資料庫活動。例如,追蹤登入資料庫的使用者或追蹤針對資料庫執行的查詢。

如果使用 Aurora MySQL 相容版,則您可以使用進階稽核。「進階稽核」可對您要記錄的查詢類型提供更多的控制權,並降低記錄的開銷。

使用 innodb_print_all_deadlocks 參數來檢查是否存在鎖死和資源鎖定。您可以使用此參數,在 MySQL 錯誤日誌中記錄有關 InnoDB 使用者交易中死結的資訊。如需更多詳細資訊,請參閱 MySQL 網站上的 innodb_print_all_deadlocks

分析並最佳化高 CPU 工作負載

確定增加 CPU 使用率的查詢後,最佳化工作負載以減少 CPU 耗用。

如果您發現工作負載不需要的查詢,請執行以下命令來結束連線

CALL mysql.rds_kill(processID);

**重要:**當您結束執行個體上的資料操作語言 (DML) 寫入時,它會復原中斷的交易。復原更新可能需要很長時間。如果您的查詢執行時間過長,請與資料庫管理員合作檢查是否可以停止該查詢。

若要尋找查詢的 processID,請執行 SHOW FULL PROCESSLIST 命令。

如果您不想結束查詢,請使用 EXPLAIN 來最佳化查詢。EXPLAIN 會顯示執行查詢時所涉及的各個步驟。如需詳細資訊,請參閱 MySQL 網站上的使用 EXPLAIN 最佳化查詢

若要查看設定檔詳細資訊,請啟用分析。SHOW PROFILE 命令顯示在目前工作階段期間所執行陳述式的資源使用情況。如需詳細資訊,請參閱 MySQL 網站上的 SHOW PROFILE 陳述式

若要查看和最佳化資料表統計資料,請使用 ANALYZE TABLE 查詢。如需詳細資訊,請參閱 MySQL 網站上的 ANALYZE TABLE 陳述式

相關資訊

使用等待事件調整 Aurora MySQL

如何啟用並監控 Amazon RDS for MySQL 資料庫執行個體的日誌?

Amazon CloudWatch Database Insights 在實際情境中的應用