文档首页/ 云数据库 RDS_云数据库 RDS for SQL Server/ 用户指南/ 问题诊断和SQL分析/ 资源过载定位及处理建议/ RDS for SQL Server CPU过载定位及处理建议
更新时间:2026-08-11 GMT+08:00
RDS for SQL Server CPU过载定位及处理建议
场景介绍
RDS for SQL Server的CPU使用率很高或接近100%。
可能原因
业务量突增的高并发。
对业务的影响
会导致数据读写处理缓慢、连接缓慢、删除出现报错等,从而影响业务正常运行。
处理建议
- 出现过载异常前的建议:
- 在参数管理页面,检查实例是否配置了合适的最大并行度参数max degree of parallelism。 图1 参数管理
该参数默认为2,可以根据实例的CPU核数调整合适的值,最大建议不超过8。具体配置建议如下:
- CPU核数为8及以下,建议配置为2。
- CPU核数为16~32,建议配置4。
- CPU核数为64及以上,建议配置为8。
- 在实时TOP SQL页面,查看是否有SQL需要优化(加索引或者调整SQL)。 图2 实时TOP SQL
在慢SQL页面,按CPU耗时倒序排列找到耗CPU最高的SQL,进行优化处理(例如添加索引)。
图3 慢SQL
- 如果是闩锁等待数很高,可以增加tempdb数量来减少CPU开销,详见创建tempdb临时数据文件。 图4 查看CPU指标
图5 查看闩锁等待数指标
- 如果实例的索引碎片率很高,会降低SQL的查询效率,增加CPU开销,可以在业务的空闲时间段进行索引重建操作。详见创建实例定期维护job。
- 在参数管理页面,检查实例是否配置了合适的最大并行度参数max degree of parallelism。
- 过载异常中的建议:
- 如果当前实例的CPU已经是100%,可以执行以下SQL。该SQL会按CPU使用率倒序排列,找到CPU使用率最高的SQL,尝试先kill对应的会话,先恢复实例到正常状态,再进行SQL优化。
SELECT TOP 10 s.session_id, r.status, r.cpu_time, r.logical_reads, r.reads, r.writes, r.total_elapsed_time / (1000 * 60) 'Elaps M', SUBSTRING(st.TEXT, (r.statement_start_offset / 2) + 1, ((CASE r.statement_end_offset WHEN -1 THEN DATALENGTH(st.TEXT) ELSE r.statement_end_offset END - r.statement_start_offset) / 2) + 1) AS statement_text, COALESCE(QUOTENAME(DB_NAME(st.dbid)) + N'.' + QUOTENAME(OBJECT_SCHEMA_NAME(st.objectid, st.dbid)) + N'.' + QUOTENAME(OBJECT_NAME(st.objectid, st.dbid)), '') AS command_text, r.command, s.login_name, s.host_name, s.program_name, s.last_request_end_time, s.login_time, r.open_transaction_count FROM sys.dm_exec_sessions AS s JOIN sys.dm_exec_requests AS r ON r.session_id = s.session_id CROSS APPLY sys.Dm_exec_sql_text(r.sql_handle) AS st WHERE r.session_id != @@SPID ORDER BY r.cpu_time DESC
- 在RDS的实时会话页面,找到执行时间很长的慢SQL,进行一键kill操作。 图6 实时会话
- 也可以使用SSMS客户端的看板来辅助定位是哪个库引起的CPU满。 图7 SSMS客户端
图8 查看资源使用情况
- 如果当前实例的CPU已经是100%,可以执行以下SQL。该SQL会按CPU使用率倒序排列,找到CPU使用率最高的SQL,尝试先kill对应的会话,先恢复实例到正常状态,再进行SQL优化。
- 过载异常后的复盘优化:
- 如果业务正常,并且SQL也没有优化的空间,则考虑扩大CPU规格,比如2U4GB可以扩大为4U8GB。
- 如果SQL存在全表扫描的情况,可以优化索引,减少CPU的开销。
- 对于一些大SQL,可以考虑做SQL拆分,业务逻辑可以放到代码中实现。