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