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

3 分的閱讀內容
0

我的 Amazon Relational Database Service (Amazon RDS) for MySQL 資料庫執行個體或 Amazon Aurora MySQL 相容版執行個體的 CPU 使用率很高。如何疑難排解並解決 CPU 使用率高的問題?

簡短描述

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

若要識別 Amazon RDS for MySQL 執行個體中 CPU 用量的來源,請檢閱下列方法:

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

在識別來源之後,您可以分析並優化您的工作負載以減少 CPU 用量。

解決方法

使用增強型監控

增強型監控提供作業系統 (OS) 層級的檢視。此檢視可以協助在精細層級找出高 CPU 負載的原因。例如,您可以檢閱負載平均值、CPU 分佈 (system%nice%),以及作業系統處理程序清單。

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

例如,如果您有一個使用 db.m5.2xlarge 執行個體類別的資料庫執行個體,其具有 3,000 個佈建 IOPS,達到了 CPU 限制,則可以檢閱下列範例指標,以識別 CPU 用量高的根本原因。在下列範例中,執行個體類別具有八個與其關聯的 vCPU。對於相同的負載平均值,超過 170 表示機器在測量時間範圍內處於重負載:

負載平均分鐘數

十五170.25
391.31
596.74

CPU 使用率

使用者 (%)0.71
系統 (%)4.9
Nice (%)93.92
總計 (%)99.97

**注意:**Amazon RDS 為您的工作負載提供比在資料庫執行個體上執行的其他任務更高的優先順序。為了排定這些任務的優先順序,工作負載任務具有較高的 Nice 值。因此,在增強型監控中,Nice% 代表您的工作負載對資料庫使用的 CPU 數量。

開啟增強型監控後,您也可以檢查與資料庫執行個體關聯的作業系統處理程序清單。增強型監控最多顯示 100 個處理程序。這可以協助您根據 CPU 和記憶體使用情況確定哪些處理程序對效能影響最大。

在增強型監控的作業系統 (OS) 處理程序清單部分中,檢視作業系統處理程序RDS 處理程序。確認 mysqld 或 Aurora 處理程序的 CPU 使用率百分比。這些指標可協助您確認 CPU 使用率增加是由作業系統還是由 RDS 處理程序造成的。或者,您可以使用這些指標,來監控由 mysqld 或 Aurora 引起的任何 CPU 使用率增加。您也可以透過檢閱 cpuUtilization 的指標,來查看 CPU 使用率的劃分資訊。如需詳細資訊,請參閱使用增強型監控來監控作業系統指標

**注意:**如果啟用「效能結構描述」,您可以將作業系統執行緒 ID 映射至資料庫的處理程序 ID。如需詳細資訊,請參閱為什麼 Amazon RDS 資料庫執行個體在我具有足夠的記憶體時使用交換記憶體?

使用 Performance Insights

您可以使用 Performance Insights,來識別在執行個體上執行並導致 CPU 用量高的確切查詢。首先,啟用 Performance Insights for MySQL。然後,您可以使用 Performance Insights 來優化工作負載。請務必諮詢 DBA。

若要查看可與 Performance Insights 搭配使用的資料庫引擎,請參閱使用 Amazon RDS 上的 Performance Insights 監控資料庫負載

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

您必須先識別有問題的查詢,然後才能優化工作負載。您可以在發生高 CPU 使用率問題時執行下列查詢,以識別 CPU 使用率的根本原因。然後,優化您的工作負載以減少 CPU 用量。

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

SHOW FULL PROCESSLIST;

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

INNODB_TRX 資料表提供有關目前正在執行且並非唯讀交易的所有 InnoDB 交易的資訊。

SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;

INNODB_LOCKS 資料表提供有關 InnoDB 交易已請求但尚未收到的鎖定的資訊。

對於 MySQL 5.7 或更早版本:

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;

對於 MySQL 8.0:

SELECT * FROM performance_schema.data_locks;

INNODB_LOCK_WAITS 資料表為每個已封鎖的 InnoDB 交易提供一或多個資料列。

對於 MySQL 5.7 或更早版本:

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

對於 MySQL 8.0:

SELECT * FROM performance_schema.data_lock_waits;

您可以執行類似下列內容的查詢,以查看正在等待的交易,以及正在封鎖等待交易的交易。如需詳細資訊,請參閱 MySQL 網站上的使用 InnoDB 交易和鎖定資訊

對於 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;

SHOW ENGINE INNODB STATUS 查詢提供來自標準 InnoDB 監視器的有關 InnoDB 儲存引擎狀態的資訊。如需詳細資訊,請參閱 MySQL 網站上的 SHOW ENGINE 陳述式

SHOW ENGINE INNODB STATUS;

SHOW [GLOBAL | SESSION] STATUS 提供了有關伺服器狀態的資訊。如需詳細資訊,請參閱 MySQL 網站上的 SHOW STATUS 陳述式

SHOW GLOBAL STATUS;

**注意:**這些查詢在 Aurora 2.x (MySQL 5.7)、Aurora 1. x (MySQL 5.6)、MariaDB 10.x 上進行了測試。此外,自 MySQL 5.7.14 起,INFORMATION_SCHEMA.INNODB_LOCKS 資料表不再受支援,且已在 MySQL 8.0 中移除。performance_schema.data_locks 資料表取代了 INFORMATION_SCHEMA.INNODB_LOCKS 資料表。如需詳細資訊,請參閱 MySQL 網站上的 data_locks 資料表

分析日誌並開啟監控

當您分析日誌或想要在 Amazon RDS for MySQL 中啟用監控時,請考慮下列方法:

  • 分析 MySQL 一般查詢日誌,以檢視 mysqld 在特定時間執行的操作。您還可以檢視特定時間在執行個體上執行的查詢,包括有關用戶端何時連接或中斷連接的資訊。如需詳細資訊,請參閱 MySQL 網站上的一般查詢日誌
    **注意:**如果長時間啟用「一般查詢日誌」,日誌會耗用儲存空間,且可能會增加效能額外負擔。
  • 分析 MySQL 慢速查詢日誌,以尋找執行時間超過您為 long_query_time 設定的秒數的查詢。您也可以檢閱工作負載並分析查詢,以提高效能並減少記憶體耗用。如需詳細資訊,請參閱 MySQL 網站上的慢速查詢日誌。**提示:**在使用慢速查詢日誌或一般查詢日誌時,請將參數 log_output 設定為 FILE
  • 使用 MariaDB 稽核外掛程式來稽核資料庫活動。例如,您可以追蹤登入資料庫的使用者或針對資料庫執行的查詢。如需詳細資訊,請參閱 MariaDB 稽核外掛程式支援
  • 如果使用 Aurora for MySQL,您也可以使用進階稽核。稽核可讓您更好地控制要記錄的查詢類型。這樣做可以減少記錄的額外負荷。
  • 使用 innodb_print_all_deadlocks 參數來檢查是否存在死結和資源鎖定。您可以使用此參數,在 MySQL 錯誤日誌中記錄有關 InnoDB 使用者交易中死結的資訊。如需詳細資訊,請參閱 MySQL 網站上的 innodb_print_all_deadlocks

分析和優化高 CPU 工作負載

在識別導致 CPU 用量增加的查詢後,優化工作負載以減少 CPU 耗用。

如果發現工作負載不需要的查詢,您可以使用下列命令終止連線

CALL mysql.rds_kill(processID);

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

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

若要檢閱設定檔詳細資訊,請啟用 PROFILINGPROFILING 命令可以指示在目前工作階段期間執行的陳述式的資源用量。如需詳細資訊,請參閱 MySQL 網站上的 SHOW PROFILE 陳述式

若要更新任何資料表統計資料,請使用 ANALYZE TABLEANALYZE TABLE 命令可協助優化工具選擇適當的計畫來執行查詢。如需詳細資訊,請參閱 MySQL 網站上的 ANALYZE TABLE 陳述式


相關資訊

Amazon RDS for MySQL

Amazon RDS for MariaDB

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

使用 Performance Insights 調校 Amazon RDS for MySQL