一大早收到一堆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毫秒,等了十来秒没看到任何语句,不断地更改筛选条件,
终于看到一条异常语句,语句每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

由于语句执行期间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刚好回落●-●

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

  1. 服务器php-cgi.exe进程过多,导致CPU占用100%的解决方法

    再使用iis服务器中经常会出现php-cgi.exe进程过多,导致CPU占用100%,最终造成网站运行过慢甚至卡死的情况,重启iis会好一会,过一段时间久出现这种情况,为什么会出现这种情况呢,应该怎么 ...

  2. magento 由于Httpd进程增多,导致CPU占用100%问题

    由于Httpd进程增多,导致CPU占用100%问题 magento for version 2.2.3 前些天一直导致CPU无法控制的增多问题. 根据报错我设置了如下内容: [Mysql]mysql. ...

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

    最近项目里面的一段千年代码出了问题,这个问题以前也出现过,不过不是那么明显,这次迁移机器由以前的4台机子变成2台以后问题被放大,最终不得不解决,特此分析一下. 先放出问题的代码 ? 1 2 3 4 5 ...

  4. SQL语句导致cpu占用如此高

    一般我们可以使用sql server自带的性能分析追踪工具sql profiler分析数据库设计所产生问题的来源,进行有针对性的处理.但我们也可以通过自己写SQL语句来有针对性的进行性能方面的查询.通 ...

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

    解决此问题的关键在于如何找到造成CPU使用率过高的SQL语句.步骤如下: 1.使用Process Explorer工具查看到Oracle进程,双击Oracle进程,在弹出的属性窗口的Threads选项 ...

  6. 阿里云被挖矿使用,导致cpu长期处于100%,ddgs进程,xWx3T进程,关于redis密码

    1.使用top命令,查看到一个叫xWx3T的进程cpu占用99.8%,由于我的阿里云是单核的,所以最高只能100%. 把它用kill命令杀死后,过一会儿又启动了,又占用100%. 使用ps -ef可以 ...

  7. 解决一个 MySQL 服务器进程 CPU 占用 100%解决一个 MySQL 服务器进程 CPU 占用 100%的技术笔记》[转]

    转载地址:http://bbs.chinaunix.net/archiver/tid-1823500.html 解决一个 MySQL 服务器进程 CPU 占用 100%解决一个 MySQL 服务器进程 ...

  8. 【故障公告】数据库服务器 CPU 近 100% 引发的故障(源于 .NET Core 3.0 的一个 bug)

    非常抱歉,这次故障给您带来麻烦了,请您谅解. 今天早上 10:54 左右,我们所使用的数据库服务(阿里云 RDS 实例 SQL Server 2016 标准版)CPU 突然飙升至 90% 以上,应用日 ...

  9. 数据库服务器CPU持续百分之百、部分Session一直处于执行状态---等待事件为:asynch descriptor resize(Oracle Bug )

    问题描述: 项目反馈数据库服务器的CPU持续100%的情况,跟踪发现很多活动会话的等待事件是“asynch descriptor resize”,并且这些会话一直处于Active状态,而这些会话执行的 ...

随机推荐

  1. SQL用法笔记

    1.更改当前记录以外的数据的xh自动加1(MySQL字段为int) String sql = "UPDATE t_readtext as tr SET xh = xh +1\n" ...

  2. Centos7.2 编译安装方式搭建 phpMyAdmin

    1. 下载 编译 安装 pcre tar zxvf pcre-8.41.tar.gz cd pcre-8.41 ./configure --prefix=/opt/local/pcre-8.41 ma ...

  3. win10 永久激活 命令行方式

    现在我们可以看下当前系统的激活状态,查看方法"WIN+R"打开运行对话框,输入命令slmgr.vbs -xpr,点击确定,这样可以查看到当前系统的激活信息.大家可以发现,虽然小编系 ...

  4. Struts配置的各种视图转发类型

    上面是struts1的视图转发2中类型:1.内部请求转发(来定向到某个视图):2.浏览器重定向(来定向到某个视图). 浏览器重定向(直接访问路径)不能访问WEB-INF的jsp文件,只有服务器内部转发 ...

  5. JDBCTemplate

    1.Spring提供的一个操作数据库的技术JdbcTemplate,是对Jdbc的封装.语法风格非常接近DBUtils. JdbcTemplate可以直接操作数据库,加快效率,而且学这个JdbcTem ...

  6. JS判断当前使用设备是pc端还是web端(转MirageFireFox)

    js判断当前设备 最近用bootstrap做自适应,发现仍然很难很好的兼容web端和PC端的现实. 仔细观察百度,淘宝,京东等大型网站,发现这些网站都有对应不同客户端的子站. 站点 PC端url we ...

  7. 优化关键渲染路径CRP

    什么是关键渲染路径? 从收到 HTML.CSS 和 JavaScript 字节到对其进行必需的处理,从而将它们转变成渲染的像素这一过程中有一些中间步骤 浏览器渲染页面前需要先构建 DOM 和 CSSO ...

  8. MYSQL 中 LIMIT 用法

    mapper文件中的sql: ------------------------------------------------------------------------------------- ...

  9. 如何使用EF优雅的配置一对一的关系

    在这两天的时间已经有两位同事问到EF(Code First)如何配置一对一的关系,这个说难也不难,说简单吧,一旦设计跑偏那么在Coding的过程中将会很痛苦. 先举个很简单的例子,两个类User和Pr ...

  10. Java基础学习 —— 线程

    线程: 多线程的好处:解决了在一个进程中同时执行多个任务代码的问题. 自定义线程的创建方式: 1.自定一个类继承thread类,重写thread的run方法 吧自定义线程的任务代码写在run方法内,创 ...