作为另一个问题(SQL Server 2012 性能问题(可能是由于链接服务器))的一部分,我发现 CPU 峰值与接收的字节数峰值直接相关,这让我相信这可能是由于链接服务器.
环境
2台服务器,一台服务器通过链接服务器访问第一个数据库,关于漂亮的图表,请参阅SQL Server 2012性能问题(可能是由于链接服务器)
CPU 峰值与 Bytes Received Spike 直接相关
问题 如何找到可能导致它的查询?
我们运行的查询类型
我已经完成了我们所有的存储过程,并且它们都进行了优化。以下是我们执行的链接服务器访问类型:
从远程表中选择一个值
select @userid = userid from FBGC.FBGCommon.dbo.players where playerid = @playerid
执行存储过程,返回最多几百行的结果集
exec FBGC.Fbgcommon.dbo.qPlayersFriends @PlayerID
执行返回一个值的存储过程
exec @HasEnoughCredits = FBGC.FBGCommon.dbo.qDoesPlayerHaveEnoughCredits @PlayerID, @Cost
从删除表中删除几行
delete from FBGC.FBGCommon.dbo.InactivePlayersToBeWarned where PlayerID = @AccountOwnerPlayerID
更新远程表中的一行,或向远程表中添加一行
update FBGC.FBGCommon.dbo.users set XP = XP + @XPForTitle where userid = @userid
insert into FBGC.FBGCommon.dbo.UserXPHistory (userid, time, XPReceived, XPFromTypeID, XPFromRealmID) values (@UserID, GETDATE(), @XPForTitle, 1, @ThisRealmID)
我相信所有这些都经过优化,但是,我们似乎正在通过链接服务器加入表!
一些有趣的等待统计数据,我不知道如何解释。从http://www.sqlskills.com/blogs/paul/wait-statistics-or-please-tell-me-where-it-hurts/查询
我在 CPU 峰值期间得到了这个:
当没有 CPU 峰值时我得到这个:
这些等待时间在带有 DB2 的服务器上,SQL 2012 服务器访问另一个运行 sql server 2008 的服务器上的远程数据库(有关图表,请参阅SQL Server 2012 性能问题(可能是由于链接服务器)
重新启动 sql server 帮助 - 在很长一段时间内没有 CPU 峰值。
我们还发现,重新启动 SQL Server 会有所帮助 - 我们可能会在几个小时内出现间歇性峰值,一个小时多次,然后在重新启动后,一个小时或更长时间没有峰值。
进程浏览器
正如@EdwardDortland 所建议的那样,我使用进程资源管理器查看在减速期间哪个线程消耗最多的CPU
不幸的是,没有一个线程是罪魁祸首——在 CPU 峰值期间,所有线程都会消耗更多的 CPU。尽管在 CPU 峰值期间我看到更多的线程以红色突出显示(意思是已删除) - 不知道如何解释这一点。
CPU 峰值之前的线程数
CPU 峰值期间的线程
要回答这个问题:如何找到有问题的查询:
由于您发布的图表中的峰值持续了几分钟,因此您有足够的时间使用以下方法:
下载 sysinternals进程浏览器
使用此查询并查找该线程当前正在执行的查询:
由于我找到了问题的原因,我想分享它以防其他人可能面临类似的情况。
我的问题的原因不是链接服务器,而只是资源争用 - 这些数据库的 SQL Server 内存不足!
所以 - 如果你有类似的症状,那可能只是记忆。
这对我们来说不明显的原因是服务器上剩余大量内存,因为安装了错误(32 位)版本的 SQL Server - 它根本没有使用更多内存,因为它不能
有关检查内存压力的好方法,请参阅此问题中的评论https://dba.stackexchange.com/questions/55028/sql-server-2012-sp1-cu7-much-slower-than-sql-server-2008 - 感谢 Paul White 和其他人的洞察力!