如何對 Amazon RDS for Oracle Database 上的高 CPU 使用率進行疑難排解?

上次更新日期︰2021 年 10 月 29 日

我在 Amazon Relational Database Service (Amazon RDS) for Oracle 資料庫執行個體上遇到高 CPU 使用率。

簡短描述

如果 RDS for Oracle 資料庫具有高 CPU 使用率,請使用下列工具組合來識別原因:

  • Amazon CloudWatch Metrics
  • 增強型監控指標
  • 績效詳情指標
  • Oracle Statspack
  • 自動工作負載儲存庫 (AWR)
  • 自動資料庫診斷監控 (ADDM)
  • 作用中工作階段歷史記錄 (ASH)
  • Oracle SQLT

解決方案

診斷與高 CPU 使用率相關的問題時,請識別發生問題的時段。

CloudWatch 指標

Amazon RDS 會針對每個作用中資料庫每分鐘傳送指標給 CloudWatch。檢閱下列適用於 Amazon RDS 的 CloudWatch 指標,以識別長期間的 CPU 模式:

  • CPUUtilization
  • 如果您正在使用 T2 或 T3 執行個體,則為 CPUCreditUsage
  • 如果您正在使用 T2 或 T3 執行個體,則為 CPUCreditBalance

此外,請檢閱下列指標,以檢查工作負載是否有變更,以及是否違反任何閾值。這些因素可能會導致 CPU 使用率尖峰。

  • DatabaseConnections
  • DiskQueueDepth
  • FreeableMemory
  • ReadIOPS
  • ReadLatency
  • WriteIOPS
  • WriteLatency

如需詳細資訊,請參閱 Amazon RDS 指標檢視資料庫執行個體指標

增強型監控指標

增強型監控會提供您執行資料庫執行個體之作業系統的即時指標。雖然 CloudWatch 會從 Hypervisor 取得 CPU 使用率指標,但增強型監控會從資料庫執行個體上的代理程式取得這些指標。增強型監控指標比 CloudWatch 指標更精密。增強型監控指標會在 CloudWatch Logs 中存放 30 天。

您可以定義 1 秒至 1 分鐘的指標收集間隔。最佳實務是將業務關鍵型應用程式的精密度設定為 1 秒或 5 秒。透過此精密度,指標可提供更準確的應用程式負載資訊,以分析效能問題。

若要檢視 CPU 使用率中尖峰的時段,請執行下列動作:
  1. 開啟 Amazon RDS 主控台
  2. 在導覽窗格中,選擇 Databases (資料庫)。
  3. 選擇您想要監控的資料庫。
  4. 選擇 Monitoring (監督) 索引標籤。
  5. Monitoring (監控) 下拉式清單中,選取 Enhanced monitoring (增強型監控)。
  6. Enhanced Monitoring (增強型監控) 檢視下,如果執行個體是異地同步備份部署,請選取 primary (主要) 以檢視主要執行個體的作業系統指標。選取 secondary (次要),以檢視待命複本的指標。
  7. 選取日期和開始時間。
  8. 在右上角選取持續時間。您可以選取 5 minutes (5 分鐘)、15 minutes (15 分鐘)、30 minutes (30 分鐘) 或 1 hour (1 小時)。

CPU Total (CPU 總計) 圖表指示 CPU 使用率增加時的時段。

Load Avg 1 min (平均 1 分鐘載入)、Load Avg 5 min (平均 5 分鐘載入) 和 Load Avg 15 min (平均 15 分鐘載入) 圖形會分別顯示過去一分鐘、過去五分鐘和過去 15 分鐘請求 CPU 時間的程序數目。如果載入平均值大於 vCPU 數目,則執行個體可能發生 CPU 瓶頸。

若要檢視作業系統程序,請從 Monitoring (監控) 下拉式清單中選取 OS process list (作業系統程序清單)。然後,依 CPU% 值對清單排序,以識別具有最多 CPU 使用率的程序。

範例:

名稱 VIRT RES CPU% MEM% VMLIMIT
oracleORCL [27074]ᵗ 6.07 GiB 1,007.24 MB 44.72 12.78 無限
oracleORCL [27076]ᵗ 6.07 GiB 1,010.02 MB 44.64 12.82 無限

如需上述範例中資料欄的詳細資訊,請參閱在 RDS 主控台中檢視作業系統指標

識別擁有最高 CPU 使用率的程序之後,您可以執行下列查詢,將程序 ID 映射至資料庫上的工作階段:

SET LINESIZE 120;
SET PAGES 200;
COL OSUSER FOR a20;
COL USERNAME FOR a20;
COL MACHINE FOR a20;
SELECT a.sid, a.serial#, a.osuser, a.username, a.machine, a.sql_id, c.sql_text FROM v$session a, v$process b, v$sql c 
WHERE a.paddr=b.addr AND b.spid=&spid AND a.sql_id=c.sql_id(+);

依預設,所有增強型監視圖形都不會顯示在 Enhanced Monitoring (增強型監控) 儀表板上。若要在 CPU 使用率尖峰時取得工作負載的檢視,請執行下列動作來開啟其他圖形:

  1. 開啟 Amazon RDS 主控台
  2. 在導覽窗格中,選擇 Databases (資料庫)。
  3. 選擇您想要監控的資料庫。
  4. 選擇 Monitoring (監督) 索引標籤。
  5. Monitoring (監控) 下拉式清單中,選取 Enhanced monitoring (增強型監控)。
  6. Enhanced Monitoring (增強型簡單) 檢視下,選擇 Manage graphs (管理圖形)。
  7. 選取您要檢視的圖形。
  8. 選擇 Save (儲存)。

您可能選擇檢視的圖表範例:

記憶體

  • 免費
  • 已快取
  • 已緩衝
  • 合計
  • 作用中
  • Slab

注意:與指標相關的指標從 /proc/meminfo 檔案擷取。

交換

  • 交換
  • 免費

磁碟輸入/輸出與實體裝置輸入/輸出

  • 讀取輸入/輸出/秒
  • 寫入輸入/輸出/秒
  • 平均佇列大小
  • 等待

CPU

  • 使用者
  • 合計
  • 系統
  • 等待
  • 閒置
  • 良好

如需可用指標的清單,請參閱 MariaDB、MySQL、Oracle 和 PostgreSQL 資料庫執行個體的指標

如需有關增強型監控的詳細資訊,請參閱使用增強型加快來監控作業系統

如需增強型監控成本的相關資訊,請參閱增強型監控成本

績效詳情指標

透過 Amazon RDS 績效詳情儀表板,您可以視覺化資料庫負載,並依等待、SQL 陳述式、主機或使用者來篩選負載。

  1. 開啟 Amazon RDS 主控台
  2. 在導覽窗格中,選擇 Performance Insights (績效詳情)。
  3. 選取您要修改的資料庫執行個體。
  4. View past (檢視過去) 中,選取您選擇的持續時間。
  5. Database Load (資料庫負載) 圖表中,檢查 CPU 使用率尖峰的時間。
  6. 選擇 Top waits (最上層等待) 索引標籤。
    請注意尖峰時段的前幾個等待事件。
  7. 選擇 Top SQL (常上層 SQL) 索引標籤。
    檢閱並最佳化造成尖峰的 SQL 陳述式。

如需績效詳情成本的相關資訊,請參閱績效詳情定價

Oracle Statspack

Statspack 是一種效能報告工具,可提供資料庫在特定時段內的效能指標。

若要使用 Statspack 來檢閱執行個體的 CPU 使用率,請執行下列動作:

  1. 產生發生問題時段的 Statspack 報告
  2. 檢閱並最佳化導致高 CPU 負載的查詢。
  3. 檢閱上層等待事件。

Statspack 報告範例擷取:

-> Total DB CPU (s):           3,345
-> Captured SQL accounts for   91.3% of Total DB CPU
-> SQL reported below exceeded  1.0% of Total DB CPU
    CPU                  CPU per            Elapsed                     Old
  Time (s)   Executions  Exec (s)  %Total   Time (s)    Buffer Gets  Hash Value
---------- ------------ ---------- ------ ---------- --------------- ----------
   3043.36      598,100       0.01   91.0    3356.81     994,096,212  219593194

Module: JDBC Thin Client
SELECT tt.ORDER_TOTAL, tt.SALES_REP_ID, tt.ORDER_DATE, customers.CUST_FIRST_NAME, customers.CUST_LAST_NAME FROM   
(SELECT orders.ORDER_TOTAL, orders.SALES_REP_ID, orders.ORDER_DATE, orders.customer_id, rank() Over (ORDER BY orders.O

如需詳細資訊,請參閱 Oracle Statspack 的 Oracle 文件。

AWR

AWR 是一種 Oracle 效能報告工具,可提供特定時段內的效能指標。

注意:AWR 需要診斷套件授權,且僅適用於 Oracle 企業版。

若要使用 AWR 識別 CPU 負載的原因,請執行下列動作:

1.    執行類似下列的查詢,以識別高 CPU 負載時段的開始和結束快照 ID:

SELECT SNAP_ID, BEGIN_INTERVAL_TIME FROM DBA_HIST_SNAPSHOT ORDER BY 1;

2.    產生 AWR 報告

3.    下載 AWR 報告

4.    檢閱並最佳化 AWR 報告 SQL ordered by CPU Time (依 CPU 時間對 SQL 排序) 區段中列出的查詢。

5.    檢閱上層等待事件。

在 Oracle 12c 及更新版本中,ADDM 和 ASH 報告會包含在 AWR 報告中。

注意:如果產生超過四個連續快照 ID 的 AWR 報告,則不會包含所有 ADDM 和 ASH 報告。若要產生這些其他報告,請使用下列各節中的指示。

ADDM

ADDM 是一種診斷工具,可分析 AWR 資料、識別效能瓶頸並提供建議。

注意:ADDM 需要診斷套件授權,且僅適用於 Oracle 企業版。

1.    執行類似下列的查詢,以識別高 CPU 負載時段的開始和結束快照 ID:

SELECT SNAP_ID, BEGIN_INTERVAL_TIME FROM DBA_HIST_SNAPSHOT ORDER BY 1;

2.    產生 ADDM 報告

3.    下載 ADDM 報告

4.    檢閱 ADDM 報告中的建議。

ASH

ASH 是一種收集作用中工作階段資訊的診斷工具。若要使用 ASH 對暫時性效能問題進行疑難排解,請執行下列動作:

注意:ASH 需要診斷套件授權,且僅適用於 Oracle 企業版。

1.    產生高 CPU 負載時段的 ASH 報告

2.    下載 ASH 報告。

3.    檢閱 TOP SQL with TOP Events (包含前幾個事件的常用 SQL) 區段。

如需解譯 AWR、ADDM 和 ASH 報告的詳細資訊,請參閱 Oracle 支援文件 ID FAQ︰自動工作負載儲存庫 (AWR) 報告 (文件 ID 1599440.1)

Oracle SQLT

Amazon RDS 現可透過使用 SQLT 選項的方式支援 Oracle SQLTXPLAIN (SQLT)。SQLT 是一種工具,用於診斷執行不良的 SQL 陳述式。

若要產生特定 SQL 陳述式的報告,請參閱 Oracle SQLT

如果您在使用 SQLT 時收到下列錯誤:

Error: ORA-20106: SQLT parameter connect_identifier must be set when running SQLT from a remote client.

執行擷取之前,請先執行下列其中一項命令:

EXEC sqltxadmin.sqlt$a.set_sess_param(‘connect_identifier’, ‘@SID’);
EXEC sqltxadmin.sqlt$a.set_param(‘connect_identifier’, ‘@example-hostname:example-port/example-sid’);