当CPU使用率较高时,可能会影响查询性能。本文介绍如何查看RDS SQL Server实例的CPU使用情况,并提供排查高CPU使用率问题的方法。
查看CPU使用情况
您可以在RDS管理控制台查看RDS SQL Server实例的CPU使用情况。
共享型实例会复用CPU,因此即使实例本身的CPU使用率不高,也可能会因为复用CPU导致性能出现瓶颈,如果对数据库性能的稳定性要求较高,建议使用独享型规格的实例。
访问RDS实例详情页的监控与报警页面,在标准监控页签下查看CPU使用率信息。
不支持RDS SQL Server 2008 R2云盘版实例。
实例所在地域目前仅支持:华东1(杭州)、华东2(上海)、华北1(青岛)、华北2(北京)、华北3(张家口)、华北5(呼和浩特)、华北6(乌兰察布)、华南1(深圳)、华南2(河源)、华南3(广州)、西南1(成都)、中国(香港)、新加坡、阿联酋(迪拜) 。
访问RDS实例详情页的自治服务 > 性能优化页面,在性能洞察页签下查看CPU使用率信息。
分析性能指标
产生原因
对于突发的CPU使用率明显增高情况,常见原因有如下几种:
数据库查询请求数量突然增加。例如业务负载骤增,或数据缓存服务层出现缓存穿透等。
查询请求的开销突然增加。例如应用中出现新的低效查询请求,或某些查询语句的执行计划发生了改变等。
查询语句的执行计划编译频率明显增加。例如当实例的缓存压力增大时,执行计划缓存的数量和命中率会显著下降,将导致数据库无法重用已有的执行计划,从而需要频繁地重新编译查询语句的执行计划,增加系统整体的开销。
参数嗅探(Parameter Sniffing)导致的CPU高,当多数负载使用的已缓存执行计划并非最优时,就会出现这种情况。
分析问题
访问RDS实例详情页的自治服务 > 性能优化页面,在性能洞察页签下重点关注如下性能指标,以判断CPU使用率增高的原因。
由于页面最多仅展示8类指标,若您找不到下文指标,请单击性能洞察页面右上角的自定义指标,在弹出的全量指标页面中,通过调整下方滚动条,筛选目标指标。
指标名称 | 分析原因 |
指标名称 | 分析原因 | |
QPS | 如果QPS和CPU使用率同步增高,说明是数据库查询请求数量增加导致的CPU使用率增高,即CPU高的原因不在数据库层面,应当从应用层面分析是什么原因导致数据库查询请求数量增加。 | |
Page_Lookups/sec | Page_Lookups/sec指执行中的查询请求平均每秒累积的逻辑读页数,Page_Lookups/sec高的原因通常是查询语句的执行效率较差,该值如果较高,则查询请求的CPU开销也一定较高。如果Page_Lookups/sec和CPU使用率同步增高,但QPS变化不大,说明数据库中出现了查询语句执行开销增高的情况,需要进一步分析是哪些类型的查询语句导致了较高的CPU资源消耗,并针对具体的查询语句进行优化。 | |
Sqlcompliations | Sqlcompliations是指平均每秒查询请求的编译次数,如果Sqlcompliations和CPU使用率同步增高,但QPS变化不大,可能是查询请求的编译开销导致的CPU增高;还可以进一步检查与执行计划缓存数量相关的性能指标Cache_Object_Counts和Cache_Pages,如果这些性能指标的值下降也很明显,则很可能是实例的缓存压力过大。提高实例的内存规格是较有效的解决方法,您可以通过变更配置来变更实例规格。更多详情,请参见RDS SQL Server主实例规格列表。 |
参考案例
以下为一个实际的参考案例。
从CPU使用率监控中可以看到,CPU的升高主要出现在9:10~9:20和9:30~9:40这两个时段。该时段内实例的QPS并没有增加,9:40之后QPS才开始增加,因此CPU使用率的增高并不是数据库查询请求数量的增加导致的。
同时段Sqlcompliations的值也无明显升高,并且其绝对值也很低,因此查询编译开销也不是导致CPU升高的原因。
Page_Lookups/sec的值增高与CPU使用率的增高时间基本一致,因此较大的可能性是9:10~9:20和9:30~9:40这两个时段内有某些执行开销较高的查询请求存在,导致了实例整体CPU使用率的明显升高。
在这种情况下,需要进一步分析在上述时段内有哪些查询语句的执行导致了较高的CPU资源消耗。另外Page_Lookups/sec的值升高一定会导致CPU使用率升高,但也会有些查询语句的执行开销很高而逻辑读开销并不高,这时要分析对应时段内的查询语句以定位原因,您可以通过SQL审计查看相关语句。
分析活动会话
产生原因
RDS SQL Server实例的CPU使用率突然增高,最常见原因是数据库中出现了某些执行效率较差的查询语句。您可以使用自治服务中性能洞察功能的平均活跃会话AAS(Average Active Sessions)定位和分析这类查询语句。
分析问题
RDS每10秒会检查一次SQL Server实例中的活动会话(Active Session)信息,并记录当前活跃查询的SQL语句、查询哈希(Query Hash)、执行计划以及等待事件类型等。CPU开销高的查询语句在执行过程中,其等待事件类型(Waits)通常为CPU。
SQL Hash列的值是对SQL语句进行结构参数化之后的哈希值,用于标识和聚合相同结构的SQL语句,便于将SQL语句按照结构进行归类聚合统计,利用SQL Hash可以直接在系统视图sys.dm_exec_query_stats中基于query_hash列的值进行检索,从而获得该语句的最新执行情况统计信息。
排查方法
单击SQL Hash列的超链接,查看该语句本身的AAS统计结果。
单击执行计划列的分析,查看SQL语句的执行计划,以及自治服务分析后给出的性能优化参考建议。
以上建议是基于常规的优化策略,对于结构较为简单的SQL语句来说,效果会比较好,但对于复杂的SQL语句,建议您在参考以上优化建议的基础上,对执行计划的信息进行具体的分析并做实际测试验证。关于AAS的更多介绍,请参见性能洞察。
分析Top SQL
产生原因
通过自治服务性能洞察中的AAS功能,您可以轻松定位特定时段内导致CPU使用率升高的SQL语句,但是不能提供各类SQL语句的执行频率、平均CPU开销、整体CPU资源消耗占比等信息。为了优化实例的整体CPU资源效率,获取这些资源消耗最高的SQL语句的详细统计信息是至关重要的。
分析问题
SQL Server支持自动汇总统计SQL语句和存储过程等对象的执行信息,并可通过sys.dm_exec_query_stats
和sys.dm_exec_procedure_stats
等系统视图直接查看,便于定位各类资源开销的Top SQL。
自治服务性能优化中的TOP SQL、TOP Objects报表,以及Management Studio中的Top query类报表,实际均基于这些系统视图,虽然使用方便,但不如直接查询系统视图灵活。
优化参数
SQL Server实例的最大并行度(MAXDOP,Max Degree of Parallelism)用于控制单个查询执行时可调度的并行工作线程数量上限,其本质是通过多处理器协同处理来加速复杂查询。对于CPU密集型查询,适当提高并行度可缩短执行时间,但会占用更多系统调度资源并可能引发并发争用。配置时需权衡查询响应时间与系统整体吞吐量,建议遵循以下原则:
高并发场景(如OLTP系统)
当系统需处理大量并发请求且多数查询执行时间较短(<5秒)时,建议设置
MAXDOP≤4
,若存在高频索引操作或分区表扫描,可针对性设置MAXDOP=1
以规避并行计划开销。低并发场景(如OLAP/报表系统)
对单条复杂查询(如大数据聚合、星型连接)可提升并行度,推荐值
MAXDOP=min((逻辑CPU数/并发查询数),8)
,请遵循微软官方建议最大不超过逻辑CPU的75%(如64核系统建议≤48)。
RDS SQL Server实例的默认值为MAXDOP=2
,此配置平衡了并行效率与资源争用风险,您可以通过 EXECUTE sp_rds_configure 'max degree of parallelism', <value>
实现该参数的动态修改,但需注意修改后需监控CXPACKET等待类型和Scheduler Busy%
(SQL Server调度器用于处理任务的时间占比),建议配合cost threshold for parallelism
(默认为5)共同优化。
相关文档
- 本页导读 (1)
- 查看CPU使用情况
- 分析性能指标
- 产生原因
- 分析问题
- 参考案例
- 分析活动会话
- 产生原因
- 分析问题
- 排查方法
- 分析Top SQL
- 产生原因
- 分析问题
- 优化参数
- 相关文档