CPU使用率过高问题很容易被发现,但是诊断却不是很容易。CPU使用过高很多时候会成为其它问题的替罪羊,所以在确认和故障诊断时要抽丝剥茧。

调查CPU压力

三个主要的工具:性能监视器,SQLTrace,DMV.

性能监视器:首先用它来确认是SQL Server还是其它进程使用了过多的CPU。主要计数器有:

Processor/ %Privileged Time :在特权模式下进程线程执行代码所花时间的百分比。基本可以认为是Windows核心使用的CPU
                     Processor/ %User Time :处理器处于用户模式的时间百分比。应用程序的使用的CPU。
                     Process (sqlservr.exe)/ %Processor Time :SQLServer.exe线程使用处理器执行指令所花的时间百分比。

还有一些与SQL Server相关CPU消耗的计数器:

SQLServer:SQL Statistics/Auto-Param Attempts/sec
                     SQLServer:SQL Statistics/Failed Auto-params/sec
                     SQLServer:SQL Statistics/Batch Requests/sec
                     SQLServer:SQL Statistics/SQL Compilations/sec
                     SQLServer:SQL Statistics/SQL Re-Compilations/sec
                     SQLServer:Plan Cache/Cache hit Ratio

SQLTrace: 通过Profiler生成SQLTrace脚本,进行服务器端跟踪,来获得高CPU使用时详细信息。

DMV:a. 使用sys.dm_os_wait_stats来得到signal wait,确认CPU压力的程度.

b. 使用sys.dm_os_wait_stats和sys.dm_os_schedulers观察等待类型

c. 使用sys.dm_exec_query_stats和sys.dm_exec_sql_text找出高CPU使用的执行计划和对应的查询

d. 使用sys.dm_os_waiting_tasks观察当前与CPU使用相关等待类型

e. 使用sys.dm_exec_requests正在执行的查询的资源使用状况

调查CPU相关的等待统计:请求执行前,包含请求的会话必需等待,SQL Server会记录等待原因和时间。通过sys.dm_os_wait_stats查询这些信息。

信号等待时间(Signal wait time):sys.dm_os_wait_stats的wait_time_ms表示等待类型的总共等待时间,signal_wait_time_ms表示线程收到段义和到重新执行间的等待时间,

这些时间主要花在runnable队列里,是纯CPU等待。

通过以下查询得到信号等待的时间比率:

  1. SELECT SUM (signal_wait_time_ms) AS TotalSignalWaitTime ,
    ( SUM (CAST(signal_wait_time_ms AS NUMERIC(20, 2)))
    / SUM (CAST(wait_time_ms AS NUMERIC(20, 2))) * 100 )
    AS PercentageSignalWaitsOfTotalTime
    FROM sys .dm_os_wait_stats

也可以查询各类资源等待的比率,下面是等待top 10:

  1. SELECT TOP ( 10 )
    wait_type ,
    waiting_tasks_count ,
    ( wait_time_ms - signal_wait_time_ms ) AS resource_wait_time ,
    max_wait_time_ms ,
    CASE waiting_tasks_count
    WHEN 0 THEN 0
    ELSE wait_time_ms / waiting_tasks_count
    END AS avg_wait_time
    FROM sys .dm_os_wait_stats
    WHERE wait_type NOT LIKE '%SLEEP%' -- remove eg. SLEEP_TASK and
    -- LAZYWRITER_SLEEP waits
    AND wait_type NOT LIKE 'XE%'
    AND wait_type NOT IN -- remove system waits
    ( 'KSOURCE_WAKEUP', 'BROKER_TASK_STOP', 'FT_IFTS_SCHEDULER_IDLE_WAIT' ,
    'SQLTRACE_BUFFER_FLUSH', 'CLR_AUTO_EVENT', 'BROKER_EVENTHANDLER',
    'BAD_PAGE_PROCESS', 'BROKER_TRANSMITTER' , 'CHECKPOINT_QUEUE',
    'DBMIRROR_EVENTS_QUEUE', 'SQLTRACE_BUFFER_FLUSH', 'CLR_MANUAL_EVENT',
    'ONDEMAND_TASK_QUEUE', 'REQUEST_FOR_DEADLOCK_SEARCH' , 'LOGMGR_QUEUE',
    'BROKER_RECEIVE_WAITFOR' , 'PREEMPTIVE_OS_GETPROCADDRESS',
    'PREEMPTIVE_OS_AUTHENTICATIONOPS', 'BROKER_TO_FLUSH' )
    ORDER BY wait_time_ms DESC

与CPU相关的等待类型主要有SOS_SCHEDULER_YIELD,CXPACKET和CMEMTHREAD

SOS_SCHEDULER_YIELD: SQL Server计划程序是协同的多任务计划程序。查询占用一小段时间的CPU后自发地让出CPU给后面的查询,

并且回到可运行队列等待重新被运行,这种等待就是SOS_SCHEDULER_YIELD。

如果此等待时间在sys.dm_exec_requests或者sys.dm_os_waiting_tasks过多,则表示有高CPU使用的查询需要优化或者需要增加CPU。

CXPACKET:多处理器运行并行查询时,当同步多个线程间的查询处理器交换迭代器时出现。

CMEMTHREAD:等待同步内存对象。有些内存对象是不请允许并发访问的,当多个线程试图访问此内存对象时,就会等待。

调查计划程序队列(scheduler queues):scheduler_id<255的是隐藏的系统计划程序,如DAC,备份等。

  1. SELECT scheduler_id ,
    current_tasks_count,
    runnable_tasks_count
    FROM sys.dm_os_schedulers
    WHERE scheduler_id < 255
      current_task_count表示每个计划程序上的任务数,runnable_task_count表示runnable队列中等待CPU的任务。
 
找出高CPU消耗的查询
      主要使用sys.dm_exec_query_stats和sys.dm_exec_sql_text。下面是占用CPU时间的TOP 10查询:
  1. SELECT TOP ( 10 )
    SUBSTRING(ST.text, ( QS .statement_start_offset / 2 ) + 1,
    ( ( CASE statement_end_offset
    WHEN -1 THEN DATALENGTH (st.text)
    ELSE QS .statement_end_offset
    END - QS .statement_start_offset ) / 2 ) + 1)
    AS statement_text ,
    execution_count ,
    total_worker_time / 1000 AS total_worker_time_ms ,
    ( total_worker_time / 1000 ) / execution_count
    AS avg_worker_time_ms ,
    total_logical_reads ,
    total_logical_reads / execution_count AS avg_logical_reads ,
    total_elapsed_time / 1000 AS total_elapsed_time_ms ,
    ( total_elapsed_time / 1000 ) / execution_count
    AS avg_elapsed_time_ms ,
    qp .query_plan
    FROM sys .dm_exec_query_stats qs
    CROSS APPLY sys .dm_exec_sql_text(qs.sql_handle ) st
    CROSS APPLY sys .dm_exec_query_plan(qs.plan_handle) qp
    ORDER BY total_worker_time DESC
值得注意的是有些情况下缓存计划是会被清除的,如内存压力,数据库状态改变等。使用了with recompile的SP和option (recompile)提示的语句不会缓存执行计划。
当查询因为某些原因被重编译(统计信息改变,架构改变等),如果经常发生,则会让执行时间统计变得不准确。所以最好是每隔一段时间抓取缓存计划信息,然后汇总对比。

数据库性能高校:CPU使用过高(上)的更多相关文章

  1. 数据库性能高校:CPU使用过高(下)

    CPU使用率过高的常见原因 查询优化器会尽量从CPU,IO和内存资源成本最小的角度,找到最高效的数据访问方式.如果没有正确的索引,或者写的语句本身就会忽略索引, 又或者不准确的统计信息等情况下,查询计 ...

  2. 性能测试问题_Mysql数据库服务器的CPU占用很高

    MySQl服务器CPU占用很高 1.  问题描述 一个简单的接口,根据传入的号段查询号码归属地,运行性能测试脚本,20个并发mysql的CPU就很高,监控发现只有一个select语句,且表建立了索引 ...

  3. 性能优化-CPU占用过高问题排查

    1. 性能优化是什么? 1.1 性能优化就是发挥机器本来的性能 1.2 性能瓶颈在哪里,木桶效应.   CPU占用过高 1.现象重现 CPU占用过高一般情况是代码中出现了循环调用,最容易出现的情况有几 ...

  4. [Oracle]Oracle数据库CPU利用率很高解决方案

    Oracle数据库经常会遇到CPU利用率很高的情况,这种时候大都是数据库中存在着严重性能低下的SQL语句,这种SQL语句大大的消耗了CPU资源,导致整个系统性能低下.当然,引起严重性能低下的SQL语句 ...

  5. 《Troubleshooting SQL Server》读书笔记-CPU使用率过高(上)

    第三章 High CPU Utilization. CPU使用率过高问题很容易被发现,但是诊断却不是很容易.CPU使用过高很多时候会成为其它问题的替罪羊,所以在确认和故障诊断时要抽丝剥茧. 调查CPU ...

  6. 性能测试学习第十天-----性能案例分析之CPU消耗过高&响应时间较长

    一.现象  /pinter/case/cpu?type=1   使用google的gjson.tojson性能较差    type=2 使用性能好的阿里巴巴的fastjson库 压测过程中,发现应用服 ...

  7. 性能分析(3)- 短时进程导致用户 CPU 使用率过高案例

    性能分析小案例系列,可以通过下面链接查看哦 https://www.cnblogs.com/poloyy/category/1814570.html 系统架构背景 VM1:用作 Web 服务器,来模拟 ...

  8. 记一次linux通过jstack定位CPU使用过高问题或排查线上死锁问题

    一.java定位进程 在服务器中终端输入命令:top 可以看到进程ID,为5421的cpu这列100多了. 记下这个数字:5421 二.定位问题进程对应的线程 然后在服务器中终端输入命令:top -H ...

  9. 线上cpu使用率过高解决方案

    一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环. 下面我们将一步步定位问题,详尽的介绍每一步骤的相关知识. 一.通过top命令定位占用cpu高的进程 执行top命令得到 ...

随机推荐

  1. 尚未在 Web 服务器上注册 ASP.NET 4.0” 的解决办法

    http://www.sowsoy.com/topics-537.html win7,vs2010创建.NetFramework 4框架下的Asp.Net空网站.系统提示 “尚未在 Web 服务器上注 ...

  2. axis2 调用.net基于https的WebService接口

    一.创建证书 1,在IE中访问WSDL的URL,弹出“安全警报”窗口,查看证书->详细信息标签页->复制到文件->下一步->下一步->指定文件名,将证书下载保存为.cer ...

  3. [App]华为P6设置与Xamarin Studio连通测试

    使用模拟器进行调试十分麻烦,而且速度很慢,手头上有手机一台正好做测试机器,不过一直无法连通电脑. 百度了一番才知道,首先要在连接时候选择: PC 助手(HiSuite) 这样会加载一个类似驱动盘的资源 ...

  4. Unity 中关于 BuildSetting 中 “Optimize Mesh Data” 选项的“坑”

    Unity 在底层默认希望为你做尽可能多的优化,降低使用门槛,比如 BuildSetting 中的 Optimize Mesh Data 选项就是一个典型的例子. 这个选项到底有什么用呢?文档描述为: ...

  5. mahout算法源码分析之Collaborative Filtering with ALS-WR (四)评价和推荐

    Mahout版本:0.7,hadoop版本:1.0.4,jdk:1.7.0_25 64bit. 首先来总结一下 mahout算法源码分析之Collaborative Filtering with AL ...

  6. 使用webdav实现文档共享

    1.PC1上开启WebDAV的服务,添加创建规则:运行访问的路径.运行访问的用户(这里的用户是指PC1上的用户名和密码).访问权限

  7. Jsp学习(2)

    Jsp的三大指令 (1).include 作用:相当于把当前页面去包含页面 语法: <%@include file="/common/test.jsp" %> 实例如下 ...

  8. JMeter入门(4):Java Request实例

    目的:对Java程序进行测试: 一.核心步骤 1.创建一个Java工程: 2.将JMeter的lib目录下的jar文件添加进此工程的Build Path: 3.创建一个类并实现JavaSamplerC ...

  9. Char* ,CString ,WCHAR*之间的转换

    关于Char* ,CString ,WCHAR*之间的转换问题 GDI+所有类的接口函数如果要传递字符串作为参数的话,似乎都用UNICODE串,即WCHAR*.我开始也被整得晕头转向,因为窗口编程所用 ...

  10. HDU 2876 Ellipse, again and again

    转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://acm.hdu.edu.cn/showproblem.php ...