Tenho máquinas virtuais em dois tipos diferentes de hosts (vmware).
O host tipo A possui CPUs com velocidade de clock de 2,09 GHz
O host tipo B possui CPUs com velocidade de clock de 2,69 GHz.
Todos os outros recursos são os mesmos no nível da VM (número de soquetes de CPU/processadores virtuais, memória e disco).
Existem grupos de disponibilidade configurados entre as VMs no host tipo A (cada VM está em um host diferente). A mesma configuração com VMs no host tipo B, mas a diferença é que também existem grupos de disponibilidade distribuída configurados aqui (cada VM ainda está em um host diferente).
Notamos que algumas consultas são executadas mais rapidamente no host tipo A do que no host tipo B. Indo mais a fundo, encontrei este recurso de solução de problemas: https://learn.microsoft.com/en-us/troubleshoot/sql/database-engine/performance /solucionar problemas de consulta-perf-entre-servidores
Executei o T-SQL abaixo desse link (modificando o número de giros):
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
Resultados de exemplo para host tipo A: Spins = 2.000.000, Time_ms = 135517, Spins_Per_ms = 14
Exemplos de resultados para host tipo B: Spins = 2.000.000, Time_ms = 553587, Spins_Per_ms = 3
Os resultados do Powershell estão sempre muito mais próximos.
$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"
Resultados de exemplo do Host A: 18 segundos 704 milissegundos
Resultados de exemplo do Host B: 23 segundos 255 milissegundos
A utilização geral da CPU causada pela carga de trabalho normal é sempre menor nas VMs no host tipo B do que nas VMs no host tipo A antes, durante e depois da execução da consulta. O tempo de prontidão da CPU é aproximadamente 100-200 ms maior no VM Host A do que no VM Host B.
Informação adicional:
As únicas VMs que apresentam desempenho lento do t-sql são as VMs que participam do DAG. Outras VMs em execução no Host tipo B que não estão neste DAG específico (incluindo todas aquelas configuradas em um DAG diferente) são muito mais rápidas que as VMs no Host tipo A.
Uma VM no Host tipo B foi movida para Host tipo A, mas o desempenho permaneceu o mesmo.
Falhei em todos os AGs de uma das VMs do Host B, a execução do t-sql ainda era a mesma (muito lenta).
Com SET STATISTICS TIME, IO ON; Posso ver muitas entradas de ~ 15 ms para CPU durante toda a consulta para a VM no Host tipo B e 0 ms para CPU em quase todos os loops da VM no Host tipo A.
CPU-z mostra a velocidade do clock da CPU estável, então não parece ser um problema de configuração “verde”.
Pedi à equipe do servidor para dar uma olhada e eles não encontraram nenhuma diferença na forma como os hosts ou VMs estão configurados.
A única diferença em termos de sys.configurations é que o Filestream está habilitado nas VMs no host tipo B.
Este problema parece estar vinculado ao SQL Server. O que mais posso fazer para solucionar isso?