Há muita coisa acontecendo aqui, e a maioria é bastante ampla e vaga.
O 2008R2 RTM saiu em 21 de abril de 2010. Está totalmente sem suporte. Você deve priorizar o acesso ao Service Pack mais recente, lançado há apenas três anos. Dessa forma, você estará coberto se estiver atingindo um bug estranho ou algo assim. Vá até aqui para descobrir o que você precisa baixar.
Como você adicionou vCPUs (de 1 a 4) e não alterou nenhuma configuração, suas consultas agora podem ficar paralelas. Sei que parece que todos serão mais rápidos, mas espere!
Você pode ter adicionado RAM, mas talvez não tenha alterado a Memória máxima do servidor para que o servidor possa tirar proveito dela.
Descubra o que seu servidor está esperando. Um projeto de código aberto no qual trabalho fornece scripts gratuitos para ajudá-lo a medir seu SQL Server. Vá até aqui se você quiser experimentá-los.
Você vai querer pegar o sp_BlitzFirst para verificar as estatísticas de espera do seu servidor. Você pode executá-lo de duas maneiras.
Isso mostrará o que seu servidor está esperando desde que foi iniciado.
EXEC dbo.sp_BlitzFirst @SinceStartup = 1;
Isso mostrará quais consultas estão aguardando agora, durante uma janela de 30 segundos.
EXEC dbo.sp_BlitzFirst @Seconds = 30, @ExpertMode = 1;
Depois de descobrir em que consultas estão aguardando (há muitas coisas escritas sobre estatísticas de espera por aí), você pode começar a fazer alterações para controlar as coisas.
Se você vê-los esperando CXPACKET
, isso significa que suas consultas estão paralelas e talvez atropelando umas às outras. Se você acertar isso, provavelmente desejará aumentar o Limiar de custo para paralelismo até 50 e, talvez, reduzir o MAXDOP para 2.
Após esta etapa, é quando você deseja usar algo como sp_WhoIsActive ou sp_BlitzWho (o último está no repositório GitHub anterior) para começar a capturar planos de consulta. Além das estatísticas de espera, elas são uma das coisas mais importantes que você pode observar para descobrir o que está errado.
Você também pode conferir este artigo de Jonathan Kehayias sobre os contadores do VMWare para verificar em relação ao SQL Server.
Atualizar
Revendo as estatísticas de espera e menino, eles são estranhos. Definitivamente, há algo com as CPUs. Seu servidor geralmente fica entediado, mas quando as coisas esquentam, as coisas ficam ruins. Vou tentar quebrar isso facilmente.
Você está atingindo uma espera de veneno chamada THREADPOOL
. Você não tem muito disso, mas isso faz sentido porque seu servidor não está muito ativo. Vou explicar o porquê em um minuto.
Você tem realmente longas esperas médias SOS_SCHEDULER_YIELD
e CXPACKET
. Você está em uma VM, portanto, certifique-se de que o SQL Server tenha reservas ou que a caixa não esteja terrivelmente em excesso. Um vizinho barulhento pode realmente arruinar o seu dia aqui. Você também precisará garantir que o servidor / convidado da VM / host da VM não esteja sendo executado no modo de energia balanceada. Isso faz com que suas CPUs diminuam desnecessariamente para velocidades baixas e não retornam imediatamente à velocidade máxima.
Como eles se encaixam? Com 4 CPUs, você tem 512 threads de trabalho. Lembre-se de que você tinha a mesma quantidade com uma única CPU, mas agora que suas consultas podem ficar paralelas, elas podem consumir muito mais threads de trabalho. No seu caso, 4 threads por ramo paralelo de uma consulta paralela.
O que está acontecendo paralelo? Provavelmente tudo. O limiar de custo padrão para paralelismo é 5. Esse número foi feita a algum padrão no final dos anos 90 trabalhando em um desktop que olhou como esta .
É verdade que seu hardware é menor que a maioria dos laptops, mas você ainda está um pouco à frente disso.
Quando muitas consultas paralelas acontecem, você está ficando sem esses segmentos de trabalho. Quando isso acontece, as consultas ficam paradas aguardando o andamento dos tópicos. Também é ondeSOS_SCHEDULER_YIELD
entra. As consultas estão desativando as CPUs e não voltando a funcionar por um longo tempo. Como não vejo esperas de bloqueio, é provável que você tenha apenas esperas paralelas dentro da consulta.
O que você pode fazer?
- Verifique se nada está no modo de energia balanceada
- Altere MAXDOP para 2
- Alterar o limite de custo do paralelismo para 50
- Siga o artigo de Jon K. acima para validar a integridade da VM
- Use o script chamado
sp_BlitzIndex
para procurar por quaisquer pedidos de índice ausentes.
Para uma solução de problemas mais completa, consulte o whitepaper que escrevi para o Google sobre dimensionamento de hardware na nuvem.
Espero que isto ajude!