我在两种不同类型的主机(vmware)上有虚拟机。
主机类型 A 的 CPU 时钟速度为 2.09GHz
主机类型 B 的 CPU 时钟速度为 2.69GHz
所有其他资源在 VM 级别均相同(CPU 插槽/虚拟处理器、内存和磁盘的数量)。
主机类型 A 上的虚拟机之间存在可用性组设置(每个虚拟机位于不同的主机上)。与主机类型 B 上的虚拟机设置相同,但不同之处在于此处也设置了分布式可用性组(每个虚拟机仍然位于不同的主机上)。
我们注意到一些查询在主机类型 A 上比在主机类型 B 上运行得更快。进一步挖掘,我发现了此故障排除资源:https ://learn.microsoft.com/en-us/troubleshoot/sql/database-engine/performance /服务器间查询性能故障排除
我从该链接运行了下面的 T-SQL(修改旋转次数):
SET NOCOUNT ON
DECLARE @spins INT = 0
DECLARE @start_time DATETIME = GETDATE(), @time_millisecond INT
WHILE (@spins < 2000000)
BEGIN
SET @spins = @spins +1
END
SELECT @time_millisecond = DATEDIFF(millisecond, @start_time, getdate())
SELECT @spins Spins, @time_millisecond Time_ms, @spins / @time_millisecond Spins_Per_ms
主机类型 A 的结果示例:Spins = 2000000、Time_ms = 135517、Spins_Per_ms = 14
主机类型 B 的结果示例:Spins = 2000000、Time_ms = 553587、Spins_Per_ms = 3
Powershell 结果总是更接近。
$bf = [System.DateTime]::Now
for ($i = 0; $i -le 20000000; $i++) {}
$af = [System.DateTime]::Now
Write-Host ($af - $bf).Milliseconds " milliseconds"
Write-Host ($af - $bf).Seconds " Seconds"
主机 A 的结果示例:18 秒 704 毫秒
主机 B 的结果示例:23 秒 255 毫秒
在运行查询之前、期间和之后,由正常工作负载引起的总体 CPU 利用率在主机类型 B 上的 VM 上始终低于主机类型 A 上的 VM。VM 主机 A 上的 CPU 就绪时间比 VM 主机 B 长约 100-200 毫秒。
附加信息:
唯一具有较慢 t-sql 性能的 VM 是参与 DAG 的 VM。在主机类型 B 上运行但不在该特定 DAG 中的其他虚拟机(包括在不同 DAG 中设置的所有虚拟机)比主机类型 A 上的虚拟机快得多。
主机类型 B 上的虚拟机已移至主机类型 A,但性能保持不变。
我使主机 B 虚拟机之一的所有 AG 都失败,t-sql 执行仍然相同(非常慢)。
与SET STATICS TIME, IO ON; 在主机类型 B 上的虚拟机查询期间,我可以看到许多大约 15 毫秒的 CPU 条目,而在主机类型 A 上的虚拟机的几乎每个循环中,我都可以看到 0 毫秒的 CPU 条目。
CPU-z 显示 CPU 时钟速度保持稳定,因此这似乎不是“绿色”设置问题。
我已要求服务器团队进行查看,他们发现主机或虚拟机的配置方式没有任何差异。
sys.configurations 方面的唯一区别是在主机类型 B 上的 VM 上启用了 Filestream。
这个问题似乎与 SQL Server 相关。我还能做什么来进一步解决此问题?
我首先检查每台服务器上有哪些 XE 会话。诸如已完成的语句和其他重击 XE 项目之类的项目将产生这些类型的问题。
然后,我将收集
sqlserver.sql_batch_completed
扩展事件以及sqlos.wait_completed
针对您将要运行测试(再次)的特定 SPID 的过滤器。开启此 XE 后,运行时间应该会更长。我会发布每台服务器的 cpu_time 和持续时间。这些信息应该在执行计划中,但除了时间和等待统计信息之外,计划本身毫无价值。上述内容将帮助您开始更深入地挖掘。