如何诊断 MSSQL 高 CPU 峰值

Use*_*987 2 sql-server

我的服务器 CPU 在大约 20 分钟内飙升至 100%。数据库在某些部分部分无响应。(我知道这一点是因为用户抱怨他们无法使用某些功能,但他们可以登录并使用其他区域,只是不具体)。在我检查当前查询之前它就消失了。我想看看是什么原因造成的。有人对此有某种指示吗?我如何真正找到造成这种情况的根本原因。如何查看是什么查询导致了这个?我正在使用 MSSQL

编辑:我在 RING BUFFER LOGS 中找到了记录 id 和 CPU 峰值的时间。这能让我找到问题的根源吗?

Jos*_*ell 6

如果您没有捕获当时正在执行的查询的东西,您所能做的就是猜测。如果您使用的是 SQL Server 2016 或更高版本,并且为受影响的数据库启用了查询存储,我会提到您可以在那里跟踪长时间运行或缓慢的查询。如果您没有查询存储或在出现问题后跟踪活动的其他方式,您可能需要研究监视工具,或者至少是一些更简单的“自制”解决方案,例如记录sp_WhoIsActive到表。

如果导致此问题的查询仍在计划缓存中,您可以尝试运行sp_BlitzCache以查找最占用 CPU 资源的查询:

EXEC master.dbo.sp_BlitzCache 
    @DatabaseName = N'YourDatabaseName',
    @SortOrder = 'avg cpu';
Run Code Online (Sandbox Code Playgroud)

需要明确的是,无法确定这些查询是否是有问题的查询,但这可能是您目前最好的选择。

您还可以尝试缩小涉及的表格范围(根据您所说的应用程序的哪些区域或功能无法访问)。完成此操作后,您可以在该表上运行sp_BlitzIndex并获取其使用方式的详细信息:

EXEC master.dbo.sp_BlitzIndex 
    @DatabaseName = N'YourDatabaseName', 
    @SchemaName = N'ProbablyDbo', 
    @TableName = N'YourTableName';
Run Code Online (Sandbox Code Playgroud)

这将向您显示是否有索引被大量扫描,或经历锁升级,或长时间的锁等待等。同样,这都是潜在问题的间接证据。但这可能会有所帮助。