我在两种不同类型的主机(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 相关。我还能做什么来进一步解决此问题?