How to Troubleshoot High CPU in RDS for SQL Server

Sometimes we come with high CPU usage of RDS for SQL Server instance. Here's some common steps to troubleshoot this issue.

 

What will cause high CPU usage in SQL Server?

  1. MAXDOP
  2. T-SQL queries
  3. I/O issue caused high CPU and so on

 

How to troubleshoot this issue in RDS for SQL Server.

 

  1. First, check CPU,IOPS status in "监控与报警" at the issue time
  2. Check high wait types via "SQL诊断报告" in DMS and by the following queries

WITH [Waits] AS

    (SELECT

        [wait_type],

        [wait_time_ms] / 1000.0 AS [WaitS],

        ([wait_time_ms] - [signal_wait_time_ms]) / 1000.0 AS [ResourceS],

        [signal_wait_time_ms] / 1000.0 AS [SignalS],

        [waiting_tasks_count] AS [WaitCount],

       100.0 * [wait_time_ms] / SUM ([wait_time_ms]) OVER() AS [Percentage],

        ROW_NUMBER() OVER(ORDER BY [wait_time_ms] DESC) AS [RowNum]

    FROM sys.dm_os_wait_stats

    WHERE [wait_type] NOT IN (

        N'BROKER_EVENTHANDLER', N'BROKER_RECEIVE_WAITFOR',

        N'BROKER_TASK_STOP', N'BROKER_TO_FLUSH',

        N'BROKER_TRANSMITTER', N'CHECKPOINT_QUEUE',

        N'CHKPT', N'CLR_AUTO_EVENT',

        N'CLR_MANUAL_EVENT', N'CLR_SEMAPHORE',

 

        -- Maybe uncomment these four if you have mirroring issues

        N'DBMIRROR_DBM_EVENT', N'DBMIRROR_EVENTS_QUEUE',

        N'DBMIRROR_WORKER_QUEUE', N'DBMIRRORING_CMD',

 

        N'DIRTY_PAGE_POLL', N'DISPATCHER_QUEUE_SEMAPHORE',

        N'EXECSYNC', N'FSAGENT',

        N'FT_IFTS_SCHEDULER_IDLE_WAIT', N'FT_IFTSHC_MUTEX',

 

        -- Maybe uncomment these six if you have AG issues

        N'HADR_CLUSAPI_CALL', N'HADR_FILESTREAM_IOMGR_IOCOMPLETION',

        N'HADR_LOGCAPTURE_WAIT', N'HADR_NOTIFICATION_DEQUEUE',

        N'HADR_TIMER_TASK', N'HADR_WORK_QUEUE',

 

        N'KSOURCE_WAKEUP', N'LAZYWRITER_SLEEP',

        N'LOGMGR_QUEUE', N'MEMORY_ALLOCATION_EXT',

        N'ONDEMAND_TASK_QUEUE',

        N'PREEMPTIVE_XE_GETTARGETSTATE',

        N'PWAIT_ALL_COMPONENTS_INITIALIZED',

        N'PWAIT_DIRECTLOGCONSUMER_GETNEXT',

        N'QDS_PERSIST_TASK_MAIN_LOOP_SLEEP', N'QDS_ASYNC_QUEUE',

        N'QDS_CLEANUP_STALE_QUERIES_TASK_MAIN_LOOP_SLEEP',

        N'QDS_SHUTDOWN_QUEUE', N'REDO_THREAD_PENDING_WORK',

        N'REQUEST_FOR_DEADLOCK_SEARCH', N'RESOURCE_QUEUE',

        N'SERVER_IDLE_CHECK', N'SLEEP_BPOOL_FLUSH',

        N'SLEEP_DBSTARTUP', N'SLEEP_DCOMSTARTUP',

        N'SLEEP_MASTERDBREADY', N'SLEEP_MASTERMDREADY',

        N'SLEEP_MASTERUPGRADED', N'SLEEP_MSDBSTARTUP',

        N'SLEEP_SYSTEMTASK', N'SLEEP_TASK',

        N'SLEEP_TEMPDBSTARTUP', N'SNI_HTTP_ACCEPT',

        N'SP_SERVER_DIAGNOSTICS_SLEEP', N'SQLTRACE_BUFFER_FLUSH',

        N'SQLTRACE_INCREMENTAL_FLUSH_SLEEP',

        N'SQLTRACE_WAIT_ENTRIES', N'WAIT_FOR_RESULTS',

        N'WAITFOR', N'WAITFOR_TASKSHUTDOWN',

        N'WAIT_XTP_RECOVERY',

        N'WAIT_XTP_HOST_WAIT', N'WAIT_XTP_OFFLINE_CKPT_NEW_LOG',

        N'WAIT_XTP_CKPT_CLOSE', N'XE_DISPATCHER_JOIN',

        N'XE_DISPATCHER_WAIT', N'XE_TIMER_EVENT')

    AND [waiting_tasks_count] > 0

    )

SELECT

    MAX ([W1].[wait_type]) AS [WaitType],

    CAST (MAX ([W1].[WaitS]) AS DECIMAL (16,2)) AS [Wait_S],

    CAST (MAX ([W1].[ResourceS]) AS DECIMAL (16,2)) AS [Resource_S],

    CAST (MAX ([W1].[SignalS]) AS DECIMAL (16,2)) AS [Signal_S],

    MAX ([W1].[WaitCount]) AS [WaitCount],

    CAST (MAX ([W1].[Percentage]) AS DECIMAL (5,2)) AS [Percentage],

    CAST ((MAX ([W1].[WaitS]) / MAX ([W1].[WaitCount])) AS DECIMAL (16,4)) AS [AvgWait_S],

    CAST ((MAX ([W1].[ResourceS]) / MAX ([W1].[WaitCount])) AS DECIMAL (16,4)) AS [AvgRes_S],

    CAST ((MAX ([W1].[SignalS]) / MAX ([W1].[WaitCount])) AS DECIMAL (16,4)) AS [AvgSig_S],

    CAST ('https://www.sqlskills.com/help/waits/' + MAX ([W1].[wait_type]) as XML) AS [Help/Info URL]

FROM [Waits] AS [W1]

INNER JOIN [Waits] AS [W2]

    ON [W2].[RowNum] <= [W1].[RowNum]

GROUP BY [W1].[RowNum]

HAVING SUM ([W2].[Percentage]) - MAX( [W1].[Percentage] ) < 95; -- percentage threshold

GO

 

  1. Second check "慢日志统计",find the slow and high logical reads queries.
  2. Query high CPU statements in cache which can monitor high CPU queries.

SELECT TOP 50

[Avg. MultiCore/CPU time(sec)] = qs.total_worker_time / 1000000 / qs.execution_count,

[Total MultiCore/CPU time(sec)] = qs.total_worker_time / 1000000,

[Avg. Elapsed Time(sec)] = qs.total_elapsed_time / 1000000 / qs.execution_count,

[Total Elapsed Time(sec)] = qs.total_elapsed_time / 1000000,

qs.execution_count,

[Avg. I/O] = (total_logical_reads + total_logical_writes) / qs.execution_count,

[Total I/O] = total_logical_reads + total_logical_writes,

Query = SUBSTRING(qt.[text], (qs.statement_start_offset / 2) + 1,

(

(

CASE qs.statement_end_offset

WHEN -1 THEN DATALENGTH(qt.[text])

ELSE qs.statement_end_offset

END - qs.statement_start_offset

) / 2

) + 1

),

Batch = qt.[text],

[DB] = DB_NAME(qt.[dbid]),

qs.last_execution_time,

qp.query_plan

FROM sys.dm_exec_query_stats AS qs

CROSS APPLY sys.dm_exec_sql_text(qs.[sql_handle]) AS qt

CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS qp

where qs.execution_count > 5        --more than 5 occurences

ORDER BY [Total MultiCore/CPU time(sec)] DESC

 

Conclusions:

  1. If have too many MAXDOP wait types, in OLTP system, Customer need to set a lower value for MAXDOP。
  2. If it related to slow queries, please refer to "How to troubleshoot slow queries in RDS for SQL Server"
时间: 2024-11-15 22:55:46

How to Troubleshoot High CPU in RDS for SQL Server的相关文章

How to troubleshoot slow queries in RDS for SQL Server

What will affect the speed of queries? Index fragmentationFragmentation exists when indexes have pages in which the logical ordering, based on the key value, does not match the physical ordering inside the data file. Heavily fragmented indexes can de

使用RDS for SQL Server的一些最佳实践

了解RDS的概念 这也是第一条,也是最重要的一条,在使用某项产品和服务之前,首先要了解该产品或服务的功能与限制,就像你买一个冰箱或洗衣机,通常也只有在阅读完说明书之后才能利用起来它们的所以功能,以及使用时的注意事项,RDS for SQL Server也是如此. RDS for SQL Server与传统的自建机房提供SQL Server的主要不同就是用户所需负责数据库的模块多与少的问题,自建SQL Server与阿里云RDS for SQL Server所需负责的部分图1所示: 当然,便捷的代

SQLServer · 最佳实践 · RDS for SQL Server 2012 权限限制的提升与改善

title: SQLServer · 最佳实践 · RDS for SQL Server 2012 权限限制的提升与改善 author: 石沫 背景 SQL Server 作为一种强大的关系型数据库,能够提供所有场景的应用.在绝大多数云计算公司中,都提供了SQL Server作为服务的云数据库服务,譬如阿里云.但既然是服务,那么服务就需要可管理,可控制,因此,在云计算初期,都对云数据库服务进行了严格的权限控制,好处就是可控可管理,但给用户会带来一些限制,某些限制实际上是可以再细粒度管控.因此,今

SQL Server 云下数据增量同步至阿里云 RDS for SQL Server

近期有一个需求,将云下 SQL Server 的数据同步至云上 RDS for SQL Server.不考虑增量的话,可以直接使用 SSMS 数据库导出功能直接迁移数据到 RDS,但如果要进行增量同步的话则无法直接使用,尤 其是还要做数据过滤的场景. 那该如何解呢?可以使用 kettle 工作来做增量的插入.更新及删除,以达到增量同步的效果.具体操作步骤参考如下: 1. 前期准备 安装 Java 及配置 JAVA_HOME 安装 Kettle 2. 配置源数据库 新建转换.新建一个转换任务,"文

RDS SQL Server - 最佳实践 - 高CPU使用率系列之数据类型转换

摘要 前两篇文章讨论了导致CPU高使用率的两个重要原因是索引缺失和索引碎片,本系列文章之三讨论数据类型隐式转换话题. 场景分析 在SQL Server中,比较运算符(大于.小于.等于或者连接)两端的数据类型需要保持一直才能进行.否则,SQL Server会按照数据类型优先级由低到高进行隐式转化,然后再进行比较.这个行为可以通过执行计划中的CONVERT_IMPLICIT关键字看出来,后面的测试例子中,我们可以清楚的看到这一点.如果很不幸,导致SQL Server正式表字段数据类型隐式转换会带来几

RDS SQL Server - 最佳实践 - 高CPU使用率系列之非SARG查询

摘要 阿里云RDS SQL Server客户遇到最多的一个问题便是高CPU使用率导致导致SQL Server服务响应缓慢,查询超时,甚至服务挂起僵死.本系列文章第四篇分析非SARG查询导致CPU的高利用率的解决之道. 问题引入 "鸟啊,你听说过RDBMS的非SARG查询语句吗?我还是今天第一次听说呢!".老鸟有些不解的问菜鸟. "哈哈,鸟哥,孤陋寡闻,土鳖了吧.它可是导致RDBMS数据库CPU高使用率的又一个重要的原因呢!今天就让我细细道来.",菜鸟开始得意忘形起来

性能测试:自建数据库与RDS性能对比SQL Server案例排查分析

近期经常遇到用户将自建数据库与RDS进行对比,简单的对比结果是自建库比RDS实例查询快.我们这里来看看一个实例,有一家物流公司,刚开始使用RDS SQL Server数据库,发现通过ECS访问RDS实例,执行语句需要60s左右,但是访问ECS本地自建库只需要2-3s.那么RDS是否是真的不如自建数据库呢? 接下来,我们来探讨对比自建库和RDS的正确姿势,如何公平地对比自建库和RDS的性能. 对比自建库和RDS的语句执行性能,下面这些因素必须都考虑到: 1. 可用区和网络链路. 可用区.网络链路的

RDS SQL Server - 最佳实践 - 高CPU使用率系列之索引缺失

摘要 CPU高使用率往往会导致SQL Server服务响应缓慢,查询超时,甚至服务挂起僵死,可以说CPU高使用率是数据库这种后台进程服务的第一大杀手.本系列文章之一的"索引缺失"就是CPU高使用率的最常见的原因之一. 问题引入 "鸟啊,我们平时在服务阿里云RDS SQL Server客户的过程中,遇到最多的一个问题就是,客户反馈RDS SQL Server数据库CPU使用率很高(有时超过90%,甚至到100%),导致查询缓慢甚至超时,这类问题要如何解决啊?".老鸟已

RDS SQL Server - 最佳实践 - 高CPU使用率系列之二索引碎片

摘要 上一篇文章分析了高CPU使用率的原因之一是索引缺失,接下来本系列文章之二的"索引碎片"是CPU高使用率的又一常见的原因.解决索引碎片问题是解决SQL Server服务响应缓慢,查询超时的又一利器. 问题引入 "鸟哥,我上一篇文章分享了因为索引缺失导致CPU高使用率的话题,反响不错.接下来,我打算分享索引碎片导致CPU高使用率的话题.",菜鸟主动找到老鸟汇报工作. 上一篇文章详情参见链接:RDS SQL Server - 最佳实践 - 高CPU使用率系列之索引缺