一条语句导致CPU持续100%

一大早收到一堆CPU预警邮件,通常每天只在统计作业执行期间会收到2~3封CPU预警邮件。这次的预警来自另一台服务器,并且明细数据显示其CPU一直维持在49%。

登录到服务器,查看任务管理器(查看资源监视器更好),CPU时不时上涨到100%,CPU被谁使用了呢?虽然猜测到是被SQLServer,还是打开性能监视器添加\Processor(_Total)\% Processor Time、Process(sqlservr)\% Processor Time计数器


可以看到CPU使用率持续98%时,SQLServer占用CPU持续约为1575%,服务器有16个logical cores,平均值为1575%/16=98.44%,也就是CPU繁忙基本是由SQLServer引起。
那么就用profiler把高消耗语句拎出来(此时猜测可能是频繁执行某一高消耗的语句),列筛选设置CPU>=100毫秒,等了十来秒没看到任何语句,不断地更改筛选条件,
终于看到一条异常语句,语句每分钟执行一次,每次执行时长约30秒,执行期间服务器CPU接近100%!

--问题语句
SELECT TOP 100 T1.guid,
       T1.UserID,
       T1.UserChairID,
       T1.UserTreasure,
       T1.FirstRound,
       T1.SecondRound,
       T1.ThreeRound,
       T1.MachineSerial,
       T1.LoginIP,
       T1.RecordTime,
       T1.ServerID,
       T2.UserID         AS JSID,
       T2.UserChairID    AS JSChairID,
       T2.UserTreasure   AS JSUserTreasure,
       T2.FirstRound     AS JSFirstRound,
       T2.SecondRound    AS JSSecondRound,
       T2.ThreeRound     AS JSThreeRound,
       T2.MachineSerial  AS JSMachineSerial,
       T2.LoginIP        AS JSLoginIP
FROM   dbo.XxxxRecordDetail AS T1 WITH(NOLOCK)
       LEFT JOIN dbo.XxxxRecordDetail AS T2 WITH(NOLOCK)
            ON  T1.Guid = T2.Guid
            AND T1.UserID != T2.UserID
WHERE  T1.PeopleNum = 2
       AND T2.PeopleNum = 2
       AND T1.UserTreasure < 0
       AND T1.RecordTime >= ‘2017-5-10 8:36:36‘
       AND T1.RecordTime < ‘2017-5-10 13:36:36‘
ORDER BY
       T1.RecordTime ASC

由于语句执行期间CPU过高,因此没必要再次执行语句来查看执行计划。直接从计划缓存查找

--参考 http://www.cnblogs.com/Uest/p/6419017.html 计划缓存
--特定语句聚合性能统计µs
select top 100 SUBSTRING (c.text,(b.statement_start_offset/2) + 1
      ,((CASE WHEN b.statement_end_offset = -1 THEN LEN(CONVERT(NVARCHAR(MAX), c.text)) * 2
       ELSE b.statement_end_offset END - b.statement_start_offset)/2) + 1) RunSQL
      ,b.creation_time --编译计划的时间
      ,b.last_execution_time --上次开始执行计划的时间
      ,b.execution_count AS SQLExCount--计划自上次编译以来所执行的次数
      ,b.last_logical_reads --上次执行计划时所执行的逻辑读取次数
      ,b.total_logical_reads/b.execution_count avg_logical_reads
      ,b.last_worker_time --上次执行计划所用的 CPU 时间(微秒)
      ,b.last_elapsed_time --最近一次完成执行此计划所用的时间(微秒)
      ,b.total_elapsed_time/b.execution_count avg_elapsed_time --上次完成执行此计划所用的总时间
      --,b.sql_handle,b.plan_handle
      ,d.query_plan
      ,c.text
FROM sys.dm_exec_query_stats b with(nolock)
CROSS APPLY sys.dm_exec_sql_text(b.sql_handle) c
CROSS APPLY sys.dm_exec_query_plan(b.plan_handle) d
where c.text like ‘%KeyWords%‘

语句对应执行计划

可以看到消耗花费在聚集索引扫描,语句T2用了条件peoplenum=2进行扫描~
分析语句业务逻辑,其实就是返回Xx游戏2人局各场明细信息。T1能快速返回满足where条件的记录,何不用这些记录到T2中查找。通过指定索引,指引语句按照我们的期望的方式去执行。优化前、后跟踪对比

优化前、后性能计数器对比

可以看到修改后CPU立马降下去。在文章的开头收到的预警邮件显示最高CPU使用率为49%,但实际在某些时候达到98%+。难道sys.dm_os_ring_buffers记录数据时CPU刚好回落●-●

时间: 2024-10-10 09:25:01

一条语句导致CPU持续100%的相关文章

java程序导致cpu利用率100%的解决方法

1)先用top找出哪个线程占着cpu #top 查看cpu 100% 的进程号,如进程号为16459 #top -H -p 16459 然后再看是哪个pid 比较高   找到cpu为100%的PID PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND 16539 root      25   0 1673m 525m  10m R 98.9 13.3   6:36.83 java 16462 root      1

HashMap-死锁导致cpu占用100%分析(转)

最近项目里面的一段千年代码出了问题,这个问题以前也出现过,不过不是那么明显,这次迁移机器由以前的4台机子变成2台以后问题被放大,最终不得不解决,特此分析一下. 先放出问题的代码 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 private AlimamaCodeDAO alimamaCodeDAO;   

SQL语句导致cpu占用如此高

一般我们可以使用sql server自带的性能分析追踪工具sql profiler分析数据库设计所产生问题的来源,进行有针对性的处理.但我们也可以通过自己写SQL语句来有针对性的进行性能方面的查询.通常会用到如下三个系统视图:sys.sysprocesses ,dm_exec_sessions ,dm_exec_requests --一.查看当前的数据库用户连接有多少USE master GOSELECT *FROM sys.[sysprocesses]WHERE [spid] > 50--AN

Oracle查询语句导致CPU使用率过高问题处理

解决此问题的关键在于如何找到造成CPU使用率过高的SQL语句.步骤如下: 1.使用Process Explorer工具查看到Oracle进程,双击Oracle进程,在弹出的属性窗口的Threads选项卡中查看占用CPU较高的线程号(TID). 2.在PL/SQL工具中执行以下SQL语句: --根据sql_id获取对应的Sql语句(sql_text,sql_fulltext)select * from v$sqlarea where sql_id in ( --根据addr获取sql_id sel

Mongo部署到Win2008 上 CPU持续100%,改为 Non- NUMA 即可

数据:数据库文章条数超过200W,每天3K左右的增加. 现状:Lucene 2.9 + 盘古分词,读写分离.索引文件达到1G多,列表读取越来愈慢. 需求:前台页面实现列表秒出,检索秒出,提升用户体验. --------------------------------------------------------------------------------- 已经略过 MS-SQL分区.分库.全文索引... 上MongoDB ---------------------------------

STM32串口悬空导致CPU持续进入中断函数

STM32的串口开启中断,在串口悬空(即不接外设)的情况下,CPU会不断的进串口中断服务函数 并且接收到的数据为0,当你把外设接上,一切OK. void USART2_IRQHandler(void) { INT8U tmp; /* OK */ if(USART_GetITStatus(USART2, USART_IT_RXNE) == SET){ USART_ClearITPendingBit(USART2, USART_IT_RXNE); tmp = USART_ReceiveData(US

数据库服务器CPU 突然持续100%后自动下降原因诊断

1.CPU接近100% nmon数据 8月5日在9:20-9:40之间,出现CPU接近100%的情况,特点表现为9:20左右CPU急剧攀升,在9:45左右又快速下降 2.原因分析结果总述 2.1 持续时间与恢复方式 此次CPU攀高时间持续约20分钟,在无人工干预的情况下自动恢复 2.2 原因分析总述: 经过分析,原因为:4条SQL语句ORACLE优化器对LB_T_XXXVIDER视图.LB_T_XXXJECT_PROVIDER表.LA_XXCKAGE表的基数数据评估发生了巨大的差错,导致选择了错

逻辑推理:在一个100条语句的列表中,第n条语句是“在这个列表中,恰有n条语句为假”,可以得出什么结论?

<离散数学及其应用>第六版1.1练习题第43题的个人分析 题目:在一个100条语句的列表中,第n条语句是"在这个列表中,恰有n条语句为假"..........     a)从这些语句中得出什么结论     b) 若第n条语句是"至少有n条语句为家",结论是什么     c)假设包含99条语句,回答b 答案网上都有,我是给出自己的分析过程:(思路大概是:如果这句话话为真,推出这句话的内容为真,由这句话的内容又能推出其余话的是不是为真,再根据其余话的内容来判

linux内核3.6版本及以下的bug引发的故障--cpu使用率100%

现象:         旗舰店运价库cpu使用率100%,load升高,导致后续的请求失败.         重启服务器,cpu.load恢复正常. 触发条件:        (1)linux内核3.6版本及以下. (线上机器大部分是2.6.32)       (2)mysql-connector-java5.1.31版本及以下.(各业务线需要自己check)       (3)mysql-client没有设置socketTimeout. (各业务线需要自己check)       (4)杀死m