今天发现监控的一个SQL Server数据库实例的CPU有些异常,以下所示,系统消耗的CPU(O/S CPU Utilization)和数据库实例消耗的CPU(Instance CPU Utilization)有较大出入,登陆服务器检查,发现Database Mail Engine进程消耗了20%做业的CPU资源。并且是持续消耗这么多CPU资源。sql
首先我想的是数据库是否有狂发邮件的状况呢? 由于以前遇到过相关案例,因为开发人员更新脚本引发的一个逻辑bug,致使短期狂发邮件,从而引发这个Database Mail Engine 进程消耗大量的CPU资源,用下面脚本检查。发现一小时内最多发大概200封邮件的样子,因此排除了这个状况数据库
SELECT CONVERT(VARCHAR(13), send_request_date, 120)
,COUNT(*)
FROM msdb.dbo.sysmail_allitems WITH(NOLOCK)
WHERE send_request_date >= CONVERT(DATETIME, '2020-01-27 00:00:00', 120)
AND send_request_date <= CONVERT(DATETIME, '2020-03-14 00:00:00', 120)
GROUP BY CONVERT(VARCHAR(13), send_request_date, 120)
ORDER BY CONVERT(VARCHAR(13), send_request_date, 120);
2: 检查DatabaseMail的错误日志和系统错误日志没有发现异常状况。服务器
3: Bug引发的。app
官方文档有介绍,在SQL Server 2016中 database mail在发送大量邮件后,可能致使较高的CPU利用率。 可是这个数据库实例是SQL Server 2014(12.0.5000.0),虽然官方文档没有找到SQL Server 2014下有这个Bug的相关资料,可是以微软的尿性,基本上也颇有可能就是这个Bug。因为缺乏相关文档,有可能当前版本尚未发现这个Bug。因此可能根本没有Fix掉这个Bug(我查了一下全部的补丁列表,彻底没有说起这个)。spa
https://support.microsoft.com/en-nz/help/3197879/fix-sql-server-2016-database-mail-causes-high-cpu-usage-after-many-ema日志
并且网上彷佛也有一些网友碰到相同的案例。code
解决方案server
若是是SQL Server 2016,打上补丁Cumulative Update 2 for SQL Server 2016 SP1后便可解决。可是SQLServer 2014下,须要经过重启邮件服务临时解决问题。blog
EXEC msdb.dbo.sysmail_stop_sp
EXEC msdb.dbo.sysmail_start_sp