Temos o SQL Server 2008 R2 (10.50.1600) em execução em um servidor Windows 2008 R2 virtual. Depois de atualizar a CPU de 1 núcleo para 4 e a RAM de 4 gb para 10 gb, notamos que o desempenho é pior.
Algumas observações que vejo:
- Uma consulta que levou <5 segundos para ser executada agora está demorando mais de 200 segundos.
- A CPU está atrelada a 100 com sqlservr.exe como o culpado.
- Uma contagem de seleção(*) em uma tabela com 4,6 milhões de linhas levou mais de 90 segundos.
- Os processos em execução no servidor não foram alterados. A única mudança foi aumentar a CPU e ram.
- Outros servidores sql possuem um arquivo de paginação estático onde este servidor está configurado para gerenciá-lo por conta própria.
Alguém já se deparou com este problema antes?
Por sp_BlitzErik, eu corri
EXEC dbo.sp_BlitzFirst @SinceStartup = 1;
Dando-me esses resultados.
Há muita coisa acontecendo aqui, e a maior parte é bastante ampla e vaga.
2008R2 RTM foi lançado em 21 de abril de 2010. Está totalmente sem suporte. Você deve priorizar a obtenção do Service Pack mais recente, lançado há apenas 3 anos. Dessa forma, você estará coberto se estiver atingindo um bug estranho ou algo assim. Acesse 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 ser paralelas. Eu sei que isso soa como se todos fossem mais rápidos, mas espere!
Você pode ter adicionado RAM, mas pode não ter alterado a Memória Máxima do Servidor para que seu servidor possa aproveitá-la.
Descubra o que seu servidor está esperando. Um projeto de código aberto em que trabalho fornece scripts gratuitos para ajudá-lo a medir seu SQL Server. Passe por aqui se quiser experimentá-los.
Você vai querer pegar sp_BlitzFirst para verificar as estatísticas de espera do seu servidor. Você pode executá-lo de algumas maneiras.
Isso mostrará o que seu servidor está esperando desde que foi inicializado.
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 quais consultas estão esperando (há uma tonelada de coisas escritas sobre estatísticas de espera por aí), você pode começar a fazer alterações para manter as coisas sob controle.
Se você os vir esperando
CXPACKET
, isso significa que suas consultas estão sendo paralelas e talvez atropelando umas às outras. Se você acertar isso, provavelmente vai querer considerar aumentar o Limite de Custo para Paralelismo para 50 e talvez diminuir 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á acontecendo de errado.
Você também pode conferir este artigo de Jonathan Kehayias sobre VMWare Counters para verificar em relação ao SQL Server.
Atualizar
Revendo as estatísticas de espera e cara, elas são estranhas. Definitivamente, há algo acontecendo com as CPUs. Seu servidor está principalmente sentado entediado, mas quando as coisas esquentam, as coisas ficam ruins. Vou tentar quebrar isso facilmente.
Você está acertando uma espera venenosa chamada
THREADPOOL
. Você não tem muito disso, mas isso faz sentido porque seu servidor não está muito ativo. Vou explicar por que em um minuto.Você tem esperas médias realmente longas
SOS_SCHEDULER_YIELD
eCXPACKET
. Você está em uma VM, então você vai querer ter certeza de que o SQL Server tem reservas ou que a caixa não está horrivelmente sobrecarregada. Um vizinho barulhento pode realmente arruinar seu dia aqui. Você também vai querer certificar-se de 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 para velocidades desnecessariamente baixas e elas não voltem imediatamente à velocidade máxima.Como eles se ligam? 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 ser paralelas, elas podem consumir muito mais threads de trabalho. No seu caso, 4 threads por ramificação paralela de uma consulta paralela.
O que está acontecendo em paralelo? Muito provavelmente tudo. O limite de custo padrão para paralelismo é 5. Esse número se tornou o padrão em algum momento no final dos anos 90, trabalhando em um desktop parecido com este .
É verdade que seu hardware é menor do que a maioria dos laptops, mas você ainda está um pouco à frente disso.
Quando muitas consultas paralelas são executadas, você fica sem esses threads de trabalho. Quando isso acontece, as consultas ficam paradas esperando que os encadeamentos comecem. É aí também que
SOS_SCHEDULER_YIELD
entra. As consultas estão saindo das CPUs e não voltando por um longo tempo. Eu não vejo nenhuma espera de bloqueio, então você provavelmente está cheio de esperas de paralelismo intra-consulta.O que você pode fazer?
sp_BlitzIndex
para procurar quaisquer solicitações de índice ausentes.Para uma solução de problemas mais completa, confira o whitepaper que escrevi para o Google sobre dimensionamento de hardware na nuvem.
Espero que isto ajude!
Sim! Eu experimentei esse tipo de situação no SQL Server vms em nosso farm de servidores. Observe o tempo de prontidão da CPU do host da VM e os contadores do driver do balão de memória. CPU READY TIME – BLOG PART I and Understanding VMware Ballooning Trabalhar com meu sysadmin foi fundamental, mas não foi fácil...
Uma coisa que não vi apontada é que adicionar vCPUs a uma VM pode muitas vezes desacelerá-la devido ao agendamento.
A ideia básica é que, se uma VM tiver 4 vCPUs, o hipervisor deverá aguardar a disponibilidade de 4 núcleos físicos para poder agendar todas as vCPUs, mesmo que 3 delas estejam ociosas.
Se você não tiver muitos núcleos em seu host e suas outras cargas de trabalho estiverem ocupadas, isso poderá resultar em espera extra e uma queda significativa no desempenho.
No VMware ESXi você pode vê-lo nos gráficos avançados via CPU Ready.
Aqui está um dos muitos artigos com um exemplo do mundo real disso acontecendo e como foi diagnosticado .
Adicionar mais RAM também pode causar uma queda repentina de desempenho se a alocação de RAM da VM for maior que um nó NUMA.
Além disso, a configuração de suas vCPUs (vSockets vs. vCores) pode afetar alguns aplicativos, como o SQL Server. Isso ocorre porque o próprio SQL Server reconhece NUMA (para evitar o mesmo tipo de queda de desempenho que abrange NUMA) e porque o VMware pode apresentar nós NUMA virtuais de maneira diferente.
Isso é abordado em uma postagem de blog no próprio site da VMware .
Dito isso, fico feliz que você tenha resolvido os problemas com a ajuda de Erik, mas você pode querer analisar e considerar essas coisas também.
Apenas uma ajudinha (não posso postar isso como um comentário) continuando a resposta do @sp_BlitzErik, recebi algumas consultas com Pinal e Max Vernon (não consigo lembrar onde) que dizem quanto MAXDOP você deve usar:
-------------------------------------------------- -------