SQLServer CPU瓶颈问题的判定和解决



title: SQLServer · CASE分析 · CPU瓶颈问题的判定和解决

author: 天铭

发现问题

告警

数据库出现无法登陆的告警

定位原因

监控

活跃连接堆积

实例CPU持续99%+

实例总连接数超过规格

活跃链接堆积是结果,能堆积到500+可想对业务的影响已经非常严重了
连接数超过的原因跟业务上的限制策略有关

现场

实例正常连接已经无法建立,只能利用DAC协助诊断
使用DAC

实例等待

select lastwaittype,COUNT(*) from sys.sysprocesses
where spid>50
and lastwaittype!='MISCELLANEOUS'
group by lastwaittype

    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'CLR_SEMAPHORE',    N'LAZYWRITER_SLEEP',
            N'RESOURCE_QUEUE',   N'SQLTRACE_BUFFER_FLUSH',
            N'SLEEP_TASK',       N'SLEEP_SYSTEMTASK',
            N'WAITFOR',          N'HADR_FILESTREAM_IOMGR_IOCOMPLETION',
            N'CHECKPOINT_QUEUE', N'REQUEST_FOR_DEADLOCK_SEARCH',
            N'XE_TIMER_EVENT',   N'XE_DISPATCHER_JOIN',
            N'LOGMGR_QUEUE',     N'FT_IFTS_SCHEDULER_IDLE_WAIT',
            N'BROKER_TASK_STOP', N'CLR_MANUAL_EVENT',
            N'CLR_AUTO_EVENT',   N'DISPATCHER_QUEUE_SEMAPHORE',
            N'TRACEWRITE',       N'XE_DISPATCHER_WAIT',
            N'BROKER_TO_FLUSH',  N'BROKER_EVENTHANDLER',
            N'FT_IFTSHC_MUTEX',  N'SQLTRACE_INCREMENTAL_FLUSH_SLEEP',
            N'DIRTY_PAGE_POLL', N'SP_SERVER_DIAGNOSTICS_SLEEP')
        )
    SELECT
        [W1]. [wait_type] AS [WaitType],
        CAST ([W1]. [WaitS] AS DECIMAL( 14, 2 )) AS [Wait_S],
        CAST ([W1]. [ResourceS] AS DECIMAL( 14, 2 )) AS [Resource_S],
        CAST ([W1]. [SignalS] AS DECIMAL( 14, 2 )) AS [Signal_S],
        [W1]. [WaitCount] AS [WaitCount],
        CAST ([W1]. [Percentage] AS DECIMAL( 4, 2 )) AS [Percentage],
        CAST (([W1]. [WaitS] / [W1]. [WaitCount]) AS DECIMAL (14, 4)) AS [AvgWait_S],
        CAST (([W1]. [ResourceS] / [W1]. [WaitCount]) AS DECIMAL (14, 4)) AS [AvgRes_S],
        CAST (([W1]. [SignalS] / [W1]. [WaitCount]) AS DECIMAL (14, 4)) AS [AvgSig_S]
    FROM [Waits] AS [W1]
    INNER JOIN [Waits] AS [W2]
        ON [W2].[RowNum] <= [W1].[RowNum]
    GROUP BY [W1]. [RowNum], [W1].[wait_type] , [W1] .[WaitS],
        [W1]. [ResourceS], [W1].[SignalS] , [W1] .[WaitCount], [W1].[Percentage]
    HAVING SUM ([W2] .[Percentage]) - [W1].[Percentage] < 95 ;
    GO

CPU 开销大的SQL

诊断报告

实例在无法连接前的一个诊断报告也和我们的检查结果一致

实例CPU使用率

等待信息

活跃连接都在等CPU调度,spid已经复用到1.6K+

处理方式

临时

为了让实例快速恢复,首先要做的是适当放大调整CPU affinity mask,并且让用户应用做适当降级不要再次压垮实例

ALTER SERVER CONFIGURATION SET PROCESS AFFINITY CPU = 1 TO 2,6,9 TO 10,14 TO 16,19 TO 23

长期

长期需要优化SQL逐步从根本上解决问题,当然也有的时候SQL的执行计划已经很好,只是业务的并发和RT达不到用户要求,这就需要考虑升级或做业务调整
这个CASE通过类似几个SQL优化达到了不错的效果

set statistics profile on
set statistics io on
set statistics time on

select top 50  from  where ='' order by id desc

set statistics profile off
set statistics io off
set statistics time off

执行计划的Bookmark可以进一步优化

优化建议

注意一般的情况下都要加online参数避免锁表时间过长,尤其是这个CASE中1kw+的大表;但也要清楚相应代价,具体可以看下这篇SQLServer 在线添加索引

处理结果

优化后的 SQL开销

set statistics profile on
set statistics io on
set statistics time on

select top 50  from  where ='' order by id desc

set statistics profile off
set statistics io off
set statistics time off

优化后的SQL执行计划

逻辑读从5k降到6,CPU从31降到0 ms,且从执行计划来看已经最优

实例整体优化后CPU开销变化

CPU开销明显已经下降

时间: 2024-10-31 01:49:05

SQLServer CPU瓶颈问题的判定和解决的相关文章

如何识别SQL Server中的CPU瓶颈

原文:如何识别SQL Server中的CPU瓶颈 原文出自: http://www.mssqltips.com/sqlservertip/2316/how-to-identify-sql-server-cpu-bottlenecks/   问题: 如果经常遇到CPU瓶颈而导致的SQLServer宕机,那如何去发现并解决这些相关的问题?   解决方案: 导致CPU成为SQLServer性能问题的原因有很多,比较明显的原因是因为资源不足.但是,CPU的利用率可以通过配置的更改和查询的优化来降低,所以

AIX性能监控:CPU瓶颈分析

CPU 瓶颈 ------------------- 下面我们将就如何使用命令vmstat.tprof和ps检查系统是否存在CPU瓶颈做一个简单介绍. 1. vmstat 使用命令 # vmstat 1 10 P650A:/#vmstat 1 10 System configuration: lcpu=16 mem=15744MB kthr    memory              page              faults        cpu   ----- -----------

开机出现“CPU fan error”的原因与解决

每次开机提示"CPU FAN ERROR PRESS F1 TO RESUME","CPU fan error"的是什么意思呢,不是CPU,而是辅助CPU的风扇出了问题,什么原因引起的系统提示"CPU fan error",如果解决"CPU fan error"提示呢.下面来看看开机出现"CPU fan error"的原因和解决办法. 1.系统BIOS检测不到CPU风扇的转速 开机后按Del进入BIOS选项

win7电脑开机后显示CPU Fan Error错误提示的解决方法

win7电脑开机后显示CPU Fan Error错误提示的解决方法 方法一: 如果出现CPU风扇接线接错的情况会导致出现CPU Fan Error提示,打开机箱检查CPU风扇是否连接到主板对应的接口即可. 方法二: 开机后就按下DEL键进入BIOS,进入POWER的Hardware Monitor,将CPU FAN SPEED项改成IGNORED,CHASSIS FANSPEED项改成N/A,POWER FAN SPEED项改成IGNORED,然后看是否还会出现错误提示. 方法三: 或者是由于一

求救-网站服务器被CC攻击,导致cpu高达100%。请教高手解决方法!

问题描述 网站服务器被CC攻击,导致cpu高达100%.请教高手解决方法! 网站服务器被CC攻击,w3pw进程超过25%导致cpu高达100%.请教高手解决方法!

asp+sqlserver 在海量数据操作的问题与解决思路

asp+|server|sqlserver|解决|数据|问题 现有问题:1, 所有记录在一张表上.没有分类2, 开发时,由于没有考虑这么大量的数据.查询语句放在程序中执行,造成速度过慢3, 根据关系型数据库的插入过程原理,每插入一次,建一次索引查询,那么,将占用大量的内存与CPU资源,速度也将大大降低.在表中有100条记录的情况下插入与在10000条记录的情况下插入,速度与效率是完全不一样的!4, 插入与查询是在同一张表里.并发处理数可能峰值有1000多.5, 根据关系型数据库的查询原理,如果有

SQLServer内存瓶颈——MEMORYCLERK_SQLOPTIMIZER

内存瓶颈--MEMORYCLERK_SQLOPTIMIZER 问题 用户应用报错: There is insufficient system memory in resource pool 'internal' to run this query 排查 报错是由于内存不足,SQLServer启动后内存开销会很快达到max server memory,所以通过OS看SQLServer内存开销没有意义,我们排查的方向应该是这时候内存被什么占用了/是否有异常/如何优化 我们需要了解SQLOS,它是SQ

CPU占用100%原因及解决方法

我们在使用Windows XP操作系统的时候,用着用着系统就变慢了,一看"任务管理器"才发现CPU占用达到100%.这是怎么回事情呢?遇到病毒了,硬件有问题,还是系统设置有问题,在本文中笔者将从硬件,软件和病毒三个方面来讲解系统资源占用率为什么会达到100%. CPU占用率高的九种可能: 1.防杀毒软件造成故障 由于新版的KV.金山.瑞星都加入了对网页.插件.邮件的随机监控,无疑增大了系统负担.处理方式:基本上没有合理的处理方式,尽量使用最少的监控服务吧,或者,升级你的硬件配备. 2.

Java访问数据库的速度瓶颈问题的分析及解决

访问|解决|数据|数据库|速度|问题 内容: 速度瓶颈问题的提出 JDBC访问数据库的机制 不同模式的JDBC接口的选择 Java程序中SQL语句格式的优化 软件模型中对数据库访问的设计模式的优化 将深入研究的问题 参考资料 关于作者 FoolsGarden@SMTH 自由Java传道士 2001 年 11 月 速度瓶颈问题的提出 在企业级的Java应用中,访问数据库是一个必备的环节.数据库作为数据资源的集散地,往往位于企业级软件体系的后方,供前方的应用程序访问.在Java技术的体系中,应用程序