SQL Server CPU永久卡在100%

时间:2019-06-05 19:13:33

标签: sql-server cpu-usage

几个月来,我们一直困扰着一个问题,即为两个Web服务器服务的数据库的CPU占用率高达100%,并且如果允许的话,会停留数小时。所有6个处理器。每隔几天在一天中的不同时间发生一次。 CPU使用率归因于sqlserver.exe。

这不是常见的SQL Server性能问题(“如何使查询效率更高”)。发生事件时,CPU将从典型的20%上升到100%,并一直保持在那里直到服务器重新启动。

我们正在使用SQL Server 2016 SP2累积更新6。

我们添加了一些日志记录,看到在最近的CPU事件期间,OPT_IDX_STATS上的自旋锁数量每次冲突高达5775813个自旋。不确定是原因还是症状?

Before CPU 100% incident

name                      collisions      spins spins_per_collision sleep_time backoffs
----                      ----------      ----- ------------------- ---------- --------
OPT_IDX_STATS                    787     200250            254.4473          0        5
LOCK_HASH                    2137398  630970500             295.205       1410    52938

1 minute later

name              collisions    spins spins_per_collision sleep_time backoffs
----              ----------    ----- ------------------- ---------- --------
OPT_IDX_STATS             12 69309750             5775813          7       27
LOCK_HASH              17292 49187101              2844.5         47      555

当事件提示时,我们看到大约40个查询正在运行。它们通常是相同的两个LINQ查询的实例。没有查询的经过时间超过20,000毫秒,因此长时间运行的查询不会使CPU瘫痪。它们是昂贵的查询,但这似乎是问题的征兆,而不是原因-我们看到这些查询堆积是因为DB运行太慢,因为CPU太高了。这些相同的查询(以及其他查询)一直在执行,包括重新启动DB服务器之后,并且它们在重新启动后不会引起问题。

服务器具有36 GB的内存,我们看不到使用率超过22%。

一些其他有趣的信息,杀死当前正在运行的查询会使CPU下降,但只是短暂的(随着Web服务器发送更多查询而再次上升)。暂停数据库以使查询完成可以使CPU一直处于暂停状态,但在恢复数据库后它会突然升高。重新引导数据库服务器始终可以解决该问题。在数据库重启之前和之后,Web服务器应该发送相同类型的查询,这表明SQL Server存在问题-否则为什么重启会解决该问题?

更新:我编写了一个PowerShell脚本,如果CPU> 95%的情况持续45秒钟,则该脚本将清除计划缓存,并且似乎可以解决此问题。仍然不知道问题出在哪里。

2 个答案:

答案 0 :(得分:1)

根据要求将评论复制到答案中

SQL Server的内存配置是什么?是否将其设置为正确限制SQL Server尝试为其声明的内存量?我见过人们将其保留为默认设置,然后进入病理状态,即SQL Server要求的内存超过可用内存,从而导致它与操作系统进行交换,从而降低了性能。这始终是要检查的第一件事。有一些指南可以为您的内存,操作系统和配置提供此特定设置的最佳价值。对于80%的正常配置,一个好的经验法则是占用已安装的内存,减去4GB,然后将该值用于SQL Server。

接下来要检查的是您的计划缓存等。如果您具有随请求而变化的硬编码SQL查询(未参数化),则可能会有一个污染严重的计划缓存。尝试将“高级选项”下的“优化即席查询”选项打开。尝试清除所有缓存,看看是否会影响性能(重启后会有一些问题)。

答案 1 :(得分:0)

您可以看看使用资源调控器,我不得不在类似的情况下这样做,即我不得不与一些资源消耗者共享数据库:

https://docs.microsoft.com/en-us/sql/relational-databases/resource-governor/resource-governor?view=sql-server-2017

它在SQL 2016中仍然有用,但是我很难找到链接。