如何排查 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 利用率峰值的时间段,请执行以下操作:- 打开 Amazon RDS 控制台。
- 在导航窗格中,选择 Databases(数据库)。
- 选择要监控的数据库。
- 选择 Monitoring(监控)选项卡。
- 从 Monitoring(监控)下拉列表中,选择 Enhanced monitoring(增强监控)。
- 在 Enhanced Monitoring(增强监控)视图下,如果实例为多可用区部署,请选择 primary(主要)以查看主实例的操作系统指标。选择 secondary(次要)以查看备用副本的指标。
- 选择日期和开始时间。
- 在右上角,选择持续时间。您可以选择 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 利用率峰值时的工作负载,请执行以下操作打开其他图表:
- 打开 Amazon RDS 控制台。
- 在导航窗格中,选择 Databases(数据库)。
- 选择要监控的数据库。
- 选择 Monitoring(监控)选项卡。
- 从 Monitoring(监控)下拉列表中,选择 Enhanced monitoring(增强监控)。
- 在 Enhanced Monitoring(增强监控)视图下,选择 Manage graphs(管理图表)。
- 选择要查看的图表。
- 选择 Save(保存)。
您可能选择查看的图表示例:
内存
- 免费
- 已缓存
- 已缓冲
- 合计
- 脏
- 活动
- Slab
注意:与指标相关的指标从 /proc/meminfo 文件中检索而来。
交换
- 交换
- 免费
磁盘输入/输出和物理设备输入/输出
- 读取 IO/s
- 写入 IO/s
- 平均队列大小
- 等待
CPU
- 用户
- 合计
- 系统
- 等待
- 空闲
- Nice
有关可用指标的列表,请参阅 MariaDB、MySQL、Oracle 和 PostgreSQL 数据库实例的指标。
有关增强监控的更多信息,请参阅使用增强监控来监控操作系统。
有关增强监控成本的信息,请参阅增强监控的成本。
性能详情指标
使用 Amazon RDS 性能详情控制面板时,您可以使数据库负载可视化,并按等待、SQL 语句、主机或用户来筛选负载。
- 打开 Amazon RDS 控制台。
- 在导航窗格中,选择 Performance Insights(性能详情)。
- 选择您要监控的数据库实例。
- 对于 View past(查看过去),选择您选择的持续时间。
- 在 Database Load(数据库负载)图表中,检查 CPU 使用量达到峰值的时间。
- 选择 Top waits(首要等待事件)选项卡。
请注意峰值期间的首要等待事件。 - 选择 Top SQL(首要 SQL)选项卡。
查看并优化导致峰值的 SQL 语句。
有关性能详情成本的信息,请参阅性能详情定价。
Oracle Statspack
Statspack 是一种性能报告工具,可提供指定时间段内数据库的性能指标。
要使用 Statspack 查看实例的 CPU 利用率,请执行以下操作:
- 为遇到问题的时间段生成一份 Statspack 报告。
- 查看并优化导致 CPU 负载过高的查询。
- 查看首要的等待事件。
从 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;
ASH
ASH 是一种用于收集活动会话信息的诊断工具。要使用 ASH 排查暂时性能问题,请执行以下操作:
注意:ASH 需要诊断包许可证,并且仅适用于 Oracle 企业版。
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’);