一台生产环境的 Windows Server2008 的DB服务器, 数据库为 SQL Server2014 (无补丁), 经常发生 CPU 偏高(经常跳到80%,90%, 平均也有 45%左右 )。
配置(虚拟机):
但奇怪的是这台机基本上没有用户访问, 一天都不到一次, 主要是监控的SQL和同步的SQL, 一般来说这点SQL不足以将资源占尽。
剩余内存大约只有 100MB .
处理步骤:
1. 将SQL Server最大内存设置为 2000MB, 系统内存占用无改善;
2. 重启SQL Server服务, 执行速度变快, 但过一段时间会慢下来;
3. 用下面的脚本查询SQL Server所占内存, 大约为 260MB 左右;
--查看SQLServer占用内存
IF CAST(SUBSTRING(@@VERSION,22,4) AS INT)<2008
select cast(cntr_value/(1024.0) as DECIMAL(12,1)) AS SQLServerMemoryMB
from master.sys.sysperfinfo AS s
where counter_name='Total Server Memory (KB)'
ELSE
SELECT CAST(physical_memory_in_use_kb/1024.0 AS DECIMAL(12,1)) AS SQLServerMemoryMB
FROM sys.dm_os_process_memory
4. xp_readerrorlog 查错误日志, 有如下关于系统内存不足的信息:
There is insufficient system memory in resource pool 'default' to run this query.
5. 上面的信息提到了跟资源池有关, 查 default 资源池居然显示为限制最大内存为 25%, 以为找到原因了, 改为 100%, 重启服务, 还是快不起来。后面仔细看看, 那个资源池设置是禁用的, 所有不会有影响……;
6. 在任务管理器上注销除本人之外的其它所有已断开用户( 3个);
7. 安装SQL Server2014补丁SP2。
经过 6,7 后,查询速度变快, 内存占用变小(2600MB), CPU在 1%~10% 之间波动。
综上所述, 6和7为解决问题的关键。
由于比较紧急,没有在6之后立即测速度,但个人感觉6的用处比7要大得多。
服务器上, 不用了还是注销为好, 仅仅断开无法释放内存等资源。这对比较差的服务器来说, 是非常必要的。
——————————————————
后记:
后面再观察, 安装了补丁也还是有 CPU 过高的情况, 必须注销用户才能让CPU降下来。应该是服务器的配置太低导致。