# RDS for SQL Server CPU过载定位及处理建议
#### 场景介绍
RDS for SQL Server的CPU使用率很高或接近100%。
#### 可能原因
业务量突增的高并发。
#### 对业务的影响
会导致数据读写处理缓慢、连接缓慢、删除出现报错等，从而影响业务正常运行。
#### 处理建议
- **出现过载异常前的建议：**
  - 在参数管理页面，检查实例是否配置了合适的最大并行度参数max degree of parallelism。
    图1参数管理   
    ![](https://support.huaweicloud.com/usermanual-rds-mssql/zh-cn_image_0000002725075056.png "点击放大")
    该参数默认为2，可以根据实例的CPU核数调整合适的值，最大建议不超过8。具体配置建议如下：
    - CPU核数为8及以下，建议配置为2。
    
    - CPU核数为16\~32，建议配置4。
    
    - CPU核数为64及以上，建议配置为8。
     
  
  - 在实时TOP SQL页面，查看是否有SQL需要优化（加索引或者调整SQL）。
    图2实时TOP SQL   
    ![](https://support.huaweicloud.com/usermanual-rds-mssql/zh-cn_image_0000002754514769.png "点击放大")
    在慢SQL页面，按CPU耗时倒序排列找到耗CPU最高的SQL，进行优化处理（例如添加索引）。
    图3慢SQL   
    ![](https://support.huaweicloud.com/usermanual-rds-mssql/zh-cn_image_0000002754474873.png "点击放大") 
  
  - 如果是闩锁等待数很高，可以增加tempdb数量来减少CPU开销，详见[创建tempdb临时数据文件](https://support.huaweicloud.com/bestpractice-rds-mssql/rds_04_0007.html)。
    图4查看CPU指标   
    ![](https://support.huaweicloud.com/usermanual-rds-mssql/zh-cn_image_0000002724915116.png "点击放大")
    图5查看闩锁等待数指标   
    ![](https://support.huaweicloud.com/usermanual-rds-mssql/zh-cn_image_0000002725075058.png "点击放大") 
  
  - 如果实例的索引碎片率很高，会降低SQL的查询效率，增加CPU开销，可以在业务的空闲时间段进行索引重建操作。详见[创建实例定期维护job](https://support.huaweicloud.com/bestpractice-rds-mssql/rds_04_0024.html)。
   
- **过载异常中的建议：**
  - 如果当前实例的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实时会话   
    ![](https://support.huaweicloud.com/usermanual-rds-mssql/zh-cn_image_0000002754514773.png "点击放大") 
  
  - 也可以使用SSMS客户端的看板来辅助定位是哪个库引起的CPU满。
    图7SSMS客户端   
    ![](https://support.huaweicloud.com/usermanual-rds-mssql/zh-cn_image_0000002754474877.png "点击放大")
    图8查看资源使用情况   
    ![](https://support.huaweicloud.com/usermanual-rds-mssql/zh-cn_image_0000002724915118.png "点击放大") 
   
- **过载异常后的复盘优化：**
  - 如果业务正常，并且SQL也没有优化的空间，则考虑扩大CPU规格，比如2U4GB可以扩大为4U8GB。
  
  - 如果SQL存在全表扫描的情况，可以优化索引，减少CPU的开销。
  
  - 对于一些大SQL，可以考虑做SQL拆分，业务逻辑可以放到代码中实现。
   
 
