sql server xp_readerrorlog引起的CPU爆满100%

【0】问题操作

我做了一个监控(该监控15秒发起一次查询请求到sql server)

--监控十分钟内的错误日志信息

监控语句如下:

--监控十分钟内的错误日志信息

declare   @start_time datetime,@end_time datetime
            set @start_time = DATEADD(minute,-10,GETDATE())
            set @end_time = GETDATE()
            if OBJECT_ID('tempdb..#tmp_error_log') is not null
            drop table #tmp_error_log
            create table #tmp_error_log
            (
            logdate      datetime,
            processinfo  varchar(100),
            info         varchar(8000)
            )
            insert into #tmp_error_log
            exec dbo.xp_readerrorlog 0,1,NULL,NULL,@start_time,@end_time,N'desc'
            select COUNT(1) as num, MAX(logdate) as logdate,info
            from #tmp_error_log
            where (info like '%ERROR%'
            or info like '%WARN%'
            or info like '%FAIL%'
            or info like '%STOP%')
            and info not like '%CHECKDB%'
            and info not like '%Registry startup parameters%'
            and info not like '%Logging SQL Server messages in file%'
            and info not like '%previous log for older entries%'
            group by info

 

【1】故障信息

我发现,某一个实例上,一直正在运行下面图片的语句;

等待也是等待 MSQL_XP :当某任务正在等待扩展存储过程结束时出现。 SQL Server 使用该等待状态检测潜在的 MARS 应用程序死锁。 该等待将在扩展存储过程调用结束时停止。

dm_exec_requests 查看

  

 等待类型为:MSQL_XP

 

错误日志大小查看

好像也没有多大,也就60M左右

exec xp_enumerrorlog

  

 

并行度查看

好像也没有什么问题

  

 

 

tempdb查看

如下图:好像也出现一些问题

  

 

 然后在系统表tempdb.sys.tables里存在,直接select该表名却提示表名不存在(这个应该是正常的,是局部临时表,其他会话无法访问)
用 sysindexes 查看 使用object_name(obj_id),显示null,rows 也显示0

我估计这个有点问题,既然是tempdb的问题,那么重启服务就可以了吧

 

【3】重启解决

既然推断是tempdb的问题,那么重启服务就可以了吧,重启服务提示重启失败,最终直接重启服务器,解决了。

【总结】

生产环境还是要慎重,不能瞎加东西,尽管已经测过;

我这个在之前的几个主要库测过,效率非常快才敢上,结果还是在这个次重要实例上载了跟头;

 

 

【4】复盘测试

【1】准备工作

(1)把该代码封装成存储过程  test_errlog

 

 

 

 

 

(2)构造错误日志,形成70M+

 

DECLARE @i INT

SET @i=1

WHILE @i<100000

begin

RAISERROR('wqERRORer',16,1) WITH log

RAISERROR('qwWARNer',16,1) WITH log

RAISERROR('qFAILdsfds',16,1) WITH log

RAISERROR('dCHECKDBcvxc',16,1) WITH log

RAISERROR('wqERRORer',16,1) WITH log

RAISERROR('qwWARNer',16,1) WITH log

RAISERROR('qFAILdsfds',16,1) WITH log

RAISERROR('dCHECKDBcvxc',16,1) WITH log

 

SET @i=@i+1

END

 

 

 

 

 

(3)开启perfmon与任务管理器实时查看

      

 

 

 

 

 

 

【2】模拟故障时操作

(1)模拟错误日志持续写入

 

 

 

(2)模拟如监控系统般15秒调用一次

 

 

 

 

(3)开多个会话窗口,运行(2)中的代码和【1】中的(1)的死循环

 

 

 

【3】最终测试结果

(1)1个持续运行不出来,CPU 12-15%左右,偶尔最高大约到22%

 

 

 

 

 

 

 

 

(2)2个持续运行不出来,CPU 24-28%左右,最高能到38%

 

 

 

同时我们可以看到CPU,就在这个22.57封左右的时候,这个额外进程多出来的运行时间的时候,猛涨了

 

 

 

(3)3个持续运行不出来,CPU 37~40%左右,最高能到56%

 

 

 

 

我们也可以很清楚的看到,本来是好好的循环执行的语句,只是因为从22:38分开始的,但是却是从大约23.8分左右,突然从正常的while循环每15秒运行一次,变成了这种等待;

 

 

 

 

(4)第二天早上

 

 

 

【总结,解决】是sql server2005BUG

sql server2005需要升级到SP3以上 最好SP4,

sql server2008 需要升级到SP1以上,最高最高SP

https://support.microsoft.com/en-us/topic/fix-the-execution-of-the-xp-readerrorlog-command-in-sql-server-2005-and-in-sql-server-2008-stops-responding-and-the-usage-of-the-cpu-that-is-running-the-command-increases-to-100-percent-16ce865d-3775-ebc3-3507-ea32a7ea2c7b?ui=en-us&rs=en-us&ad=us

 

  

 

posted @ 2020-12-02 11:12  郭大侠1  阅读(348)  评论(1编辑  收藏  举报