已暂停的SQL Server仍占用15%以上CPU异常问题求助
SQL Server 15 Express 无可见进程高CPU占用问题排查与解决
问题描述
SQL Server 15 Express部署在Azure VM的Windows 2016 Server上,日常负载极低:每日仅约40名用户各登录1-2分钟,另有一个小型加载程序每日运行约15分钟。存在两个异常现象:
- 无论昼夜,SQL Server始终存在CPU占用,使用who is active查询无任何运行中进程;
- 即便将数据库暂停,其CPU占用仍可达15%以上,峰值甚至超过40%。
可能的原因
- SQL Server 后台系统任务运行:Express版本自带的自动统计信息更新、索引维护、死锁监控、扩展事件会话、默认跟踪等后台任务不会显示在who is active的用户进程列表中,会持续占用CPU资源。
- Azure VM 代理进程干扰:Azure平台默认会在Windows VM中注入监控代理、安全代理进程,部分代理会持续扫描SQL Server进程内存、端口状态,产生的CPU占用会被统计到
sqlservr.exe的资源消耗中。 - 系统表或内部队列异常:损坏的msdb系统表、未处理的Service Broker消息队列、异常的作业调度残留进程会导致SQL Server后台线程持续循环重试,产生无可见用户进程的CPU占用。
- Express版本资源限制触发调度异常:SQL Server Express版本限制最多使用1个物理CPU、1GB内存,当内存阈值被触发时,后台的内存清理、页面置换线程会持续运行,产生持续CPU消耗。
- 暂停操作未终止后台线程:SQL Server的“暂停”操作仅阻止新用户连接,不会终止正在运行的后台系统线程,已启动的后台任务会继续运行直到完成,因此暂停后仍会有CPU占用。
排查步骤
- 查看SQL Server系统动态管理视图确认后台线程消耗,执行查询:
SELECT session_id, command, cpu_time, total_elapsed_time FROM sys.dm_exec_requests WHERE session_id < 50
系统进程的session_id均小于50,不会被who is active默认捕获,可从中定位高CPU消耗的后台任务类型。 - 打开Windows任务管理器的详细信息页,确认高CPU占用的进程是否为
sqlservr.exe本身,排除Azure代理进程、第三方杀毒软件扫描SQL Server文件产生的统计误判。 - 查看SQL Server默认日志与系统日志,执行查询获取近期错误记录:
EXEC xp_readerrorlog 0, 1, N'CPU', N'spinlock'
排查是否存在自旋锁冲突、系统表损坏、统计信息更新失败等异常日志。 - 关闭所有默认运行的跟踪、扩展事件会话,临时禁用SQL Server代理作业,观察CPU占用是否下降,排除后台监控任务的影响。
解决方案
- 禁用不必要的SQL Server后台功能:执行如下命令关闭默认跟踪,删除未使用的扩展事件会话,关闭自动更新统计信息的异步更新选项:
sp_configure 'show advanced options', 1; RECONFIGURE; sp_configure 'default trace enabled', 0; RECONFIGURE;
- 调整Azure VM监控配置:在Azure门户中关闭VM级别不必要的安全扫描、内存采样功能,排除第三方代理进程对SQL Server的资源占用统计干扰。
- 修复系统表异常:执行
DBCC CHECKDB (msdb) WITH NO_INFOMSGS, ALL_ERRORMSGS检查msdb系统表损坏,清理Service Broker残留队列:ALTER DATABASE [数据库名] SET NEW_BROKER WITH ROLLBACK IMMEDIATE; - 配置SQL Server内存上限:即使是Express版本,也需设置合理的最大内存阈值,避免内存溢出触发持续的页面置换:
sp_configure 'max server memory (MB)', 800; RECONFIGURE;
- 若暂停后CPU仍持续过高,直接重启SQL Server服务即可终止所有残留后台线程,重启后观察CPU占用是否恢复正常。
内容的提问来源于stack exchange,提问作者user3096961
相关产品推荐
相关产品推荐

