如何排查 Amazon RDS for Oracle 数据库上的高 CPU 利用率问题?

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

对于 Oracle 数据库实例,我的 Amazon Relational Database Service (Amazon RDS) 上的 CPU 使用率很高。

简短描述

如果 RDS for Oracle 数据库的 CPU 使用率较高,请结合使用以下工具来确定原因:

  • Amazon CloudWatch 指标
  • 增强监控指标
  • 性能详情指标
  • Oracle Statspack
  • 自动工作负载存储库 (AWR)
  • 自动数据库诊断监视器 (ADDM)
  • 活动会话历史记录 (ASH)
  • Oracle SQLT

解决方法

诊断与高 CPU 利用率相关的问题时,请确定问题发生的时间段。

CloudWatch 指标

Amazon RDS 每分钟向 CloudWatch 发送每个活动数据库的指标。查看 Amazon RDS 的以下 CloudWatch 指标,以识别长时间内的 CPU 模式:

  • CPUUtilization
  • CPUCreditUsage,如果您使用的是 T2 或 T3 实例
  • CPUCreditBalance,如果您使用的是 T2 或 T3 实例

另外,请查看以下指标,以检查工作负载是否发生了变化以及是否已超过阈值。这些因素可能会导致 CPU 利用率的飙升。

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

有关更多信息,请参阅 Amazon RDS 指标查看数据库实例指标

增强监控指标

增强监控提供关于运行数据库实例的操作系统的指标。当 CloudWatch 从管理程序获取 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(监控)下拉列表中选择操作系统进程列表。然后,按 CPU% 值对列表进行排序,以确定 CPU 使用率最高的进程。

示例:

NAME VIRT RES CPU% MEM% VMLIMIT
oracleORCL [27074]ᵗ 6.07GiB 1007.24MB 44.72 12.78 无限制
oracleORCL [27076]ᵗ 6.07GiB 1010.02MB 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(+);

默认情况下,增强监控控制面板上不会显示所有增强监控图表。要查看 CPU 利用率峰值时的工作负载,请执行以下操作打开其他图表:

  1. 打开 Amazon RDS 控制台
  2. 在导航窗格中,选择 Databases(数据库)。
  3. 选择要监控的数据库。
  4. 选择 Monitoring(监控)选项卡。
  5. Monitoring(监控)下拉列表中,选择 Enhanced monitoring(增强监控)。
  6. Enhanced Monitoring(增强监控)视图下,选择 Manage graphs(管理图表)。
  7. 选择要查看的图表。
  8. 选择 Save(保存)。

您可能选择查看的图表示例:

内存

  • 免费
  • 已缓存
  • 已缓冲
  • 合计
  • 活动
  • Slab

注意:与指标相关的指标从 /proc/meminfo 文件中检索而来。

交换

  • 交换
  • 免费

磁盘输入/输出和物理设备输入/输出

  • 读取 IO/s
  • 写入 IO/s
  • 平均队列大小
  • 等待

CPU

  • 用户
  • 合计
  • 系统
  • 等待
  • 空闲
  • Nice

有关可用指标的列表,请参阅 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 报告的按 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.    查看带有首要事件的首要 SQL 部分。

有关解释 AWR、ADDM 和 ASH 报告的信息,请参阅 Oracle 支持文档中的 Oracle 支持文档 ID 常见问题:自动工作负载存储库 (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’);