一大早收到一堆CPU预警邮件,通常每天只在统计作业执行期间会收到2~3封CPU预警邮件。这次的预警来自另一台服务器,并且明细数据显示其CPU一直维持在49%。
一条语句导致CPU持续100%
登录到服务器,查看任务管理器(查看资源监视器更好),CPU时不时上涨到100%,CPU被谁使用了呢?虽然猜测到是被SQLServer,还是打开性能监视器添加\Processor(_Total)\% Processor Time、Process(sqlservr)\% Processor Time计数器
一条语句导致CPU持续100%
一条语句导致CPU持续100%
可以看到CPU使用率持续98%时,SQLServer占用CPU持续约为1575%,服务器有16个logical cores,平均值为1575%/16=98.44%,也就是CPU繁忙基本是由SQLServer引起。
那么就用profiler把高消耗语句拎出来(此时猜测可能是频繁执行某一高消耗的语句),列筛选设置CPU>=100毫秒,等了十来秒没看到任何语句,不断地更改筛选条件,
终于看到一条异常语句,语句每1分钟执行一次,每次执行时长约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
View Code

相关文章: