更新时间: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
  • 过载异常中的建议:
    • 如果当前实例的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 查看资源使用情况
  • 过载异常后的复盘优化:
    • 如果业务正常,并且SQL也没有优化的空间,则考虑扩大CPU规格,比如2U4GB可以扩大为4U8GB。
    • 如果SQL存在全表扫描的情况,可以优化索引,减少CPU的开销。
    • 对于一些大SQL,可以考虑做SQL拆分,业务逻辑可以放到代码中实现。

相关文档