博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL Server服务器CPU爆高解决
阅读量:5846 次
发布时间:2019-06-18

本文共 2260 字,大约阅读时间需要 7 分钟。

     昨天下午,测试反映trunk测试环境的数据库CPU一直100%,一开始以为是病毒,内网这段时间老是有个挖矿的病毒,查了一下被隔离了,但是数据库还是慢,停掉SQL server的服务CPU降下来,启动SSQL server的服务器就CPU就到100%,按照正常情况,

SQL Server导致CPU爆高,一般是异常SQL引起,但查询了监控:

   

   查询是RiskControlAnalysis,TaskTrunk库的sql比较多,先分离RiskControlAnalysis看看是否是这个库的原因,分离后CPU还是很高,再分离TaskTrunk库,报错,无法分离,这时怀疑是服务器的磁盘性能问题,停SQL服务,用

CrystalDiskMark 6.0测试一下磁盘的性能,磁盘性能的确不怎样,但是也没差到这样的地步。

    后面只能进一步分离TaskTrunk库,分离后,在看服务器CPU,发现正常了,原因就出在TaskTrunk库,后来在看看监控的sql,发现一条查询SQL:     

select count(1) from tb_log E where 1=1  and E.taskid=@taskid

 这个tb_log 有3亿条,查询taskid字段没有索引,导致查询IO很慢,进而影响CPU爆高。后重建一张新的tb_log表,并在taskid字段加上索引,以前的表做历史数据。性能问题解决。

  

   现在想想,就一个简单的SQL查询,用DMV性能视图和实时监控的SQL,为何查不出来,这个监控查SQL,他的CPU和时间都不是特别高,并没有特殊异常的情况,而且查数据库也没有未提交的事务在运行。

  如果这样的情况出现在线上,解决的时间这么长,肯定会问题。想想有没有简单的方法发现这个SQL,突发灵感,以前查询正在执行的SQL就可以发现这个问题,测试了一下,的确可用:

    这个SQL:  查询正在执行的SQL

                    优势:  1,以前的DMV是查已经执行完毕的SQL,如果这个SQL一直假死,性能视图就查不出来

                               2,和[sp_WhoIsActive]监控出来的sql相比,能很清晰的显示正在执行的sql和等待事件,定位更精准,特别是正在运行的

 

--数据库CPU很高,查询问题的SQL,根据时间“等待毫秒”,查出问题的SQLSELECT   spid,         blocked,         DB_NAME(sp.dbid) AS DBName,(select top 1 s.host_process_idfrom Sys.dm_exec_requests r with(nolock)right outer join Sys.dm_exec_sessions s  with(nolock)on r.session_id = s.session_idright outer join Sys.dm_exec_connections c  with(nolock)on s.session_id = c.session_id where s.host_name=sp.hostname) 应用服务器进程Id,(select top 1 c.client_net_addressfrom Sys.dm_exec_requests r with(nolock)right outer join Sys.dm_exec_sessions s  with(nolock)on r.session_id = s.session_idright outer join Sys.dm_exec_connections c  with(nolock)on s.session_id = c.session_id where s.host_name=sp.hostname) IP,         a.[Text] AS [TextData],         waitresource,         sp.waittime 等待毫秒,         sp.stmt_start,         lastwaittype,          sp.hostname,         a.[Text] AS [TextData],          program_name,          sp.loginame,         sp.Status,         SUBSTRING(A.text, sp.stmt_start / 2,         (CASE WHEN sp.stmt_end = -1 THEN DATALENGTH(A.text) ELSE sp.stmt_end         END - sp.stmt_start) / 2) AS [current_cmd]FROM     sys.sysprocesses AS sp OUTER APPLY sys.dm_exec_sql_text (sp.sql_handle) AS AWHERE    spid > 50 --and lastwaittype='HADR_SYNC_COMMIT'AND Status<>'sleeping'                     ORDER BY sp.waittime desc;
View Code

 

  

 

转载于:https://www.cnblogs.com/zping/p/10401651.html

你可能感兴趣的文章
Yii2使用$this->context获取当前的Module/Controller/Action
查看>>
Oracle创建表空间、创建用户以及授权、查看权限
查看>>
ERC20 代币标准
查看>>
iOS设计模式——工厂模式
查看>>
Xcode的Product Name、Bundle Name、Bundle Display Name
查看>>
CentOS6.5 下安装Docker
查看>>
小程序云开发之初体验(感觉腾讯对小程序的支持力度加到了好多)
查看>>
@RequestBody忽略不认识的属性
查看>>
重新认识java-ArrayList
查看>>
虚荣和骄傲会让你跌得很惨
查看>>
Swift学习资料汇总
查看>>
SQLServer分页
查看>>
rabbitmq学习
查看>>
Cobbler 快速入门指南(翻译)
查看>>
mac 10.14 编辑crontab
查看>>
IOS MD5加密字符串
查看>>
java 实现WebService 以及不同的调用方式
查看>>
REST和SOAP Web Service的比较(写得非常清晰易懂,转载于此)
查看>>
怎么面试架构师
查看>>
JAVA中循环删除list中元素的方法总结
查看>>