Aguarde… Carregando

Casos do Dia a Dia: Comprei um servidor melhor e o SQL Server está mais lento! Como pode???

Olá Pessoal,

Passando para compartilhar com vocês mais uma experiência que tive no meu dia a dia de Consultor SQL Server.

Uma empresa entrou em contato comigo para ajudá-los a entender porque um servidor SQL Server novo e com hardware melhor estava com uma performance pior que o antigo.

Cenário:

Servidor Antigo:

  • 16 GB de memória
  • 6 Cores
  • Disco SSD

Servidor Novo:

  • 128 GB de memória
  • 12 Cores
  • Disco SSD

Eles fizeram uma procedure que tinha um loop com 100 mil iterações e que cada iteração realizava um select e update em uma tabela. A procedure demorava 20 segundos no servidor antigo e 40 segundos no servidor novo. O dobro do tempo!!!

Aí você mata o diretor do coração!!! Falar que o servidor que ele investiu uma boa grana está com uma performance pior que o antigo não é legal.

Iniciando a análise, verifiquei que o plano de execução das queries era o mesmo nos dois servidores e eles estavam realizando a mesma quantidade de reads.

Dessa forma, resolvi fazer um loop que não realizava nenhuma consulta (acesso a disco) para comparar o processamento entre os dois servidores.

Segue a query do loop:

SET NOCOUNT ON

declare @tmpCount int
select @tmpCount = 0

while @tmpCount <= 10000000
begin
set @tmpCount = @tmpCount + 1
end

Esse loop demorou 5 segundos no servidor antigo e 10 segundos no servidor novo. Exatamente o dobro, assim como a procedure de teste deles.

Opa!!! O problema é CPU.

Para comparar a CPU entre os servidores, utilizei a ferramenta CPU-Z:

 

Comparei os dois servidores e verifiquei que a informação Core Speed estava com os seguintes valores:

Servidor Antigo: 2592 MHz

Servidor Novo: 1210 MHz

Opa!!! Algo de estranho no ar.

Alguma coisa estava segurando a utilização de CPU, visto que o processador do servidor novo era melhor que o do servidor antigo.

Após um bate papo com meu amigo Rodrigo (Blog), validei várias configurações entre os servidores e uma delas era a opção de energia do servidor.

Por default, esse servidor estava com a opção de energia marcada como “Balanced”. Alterei para “High performance” conforme figura abaixo:

 

Feito isso, na hora o Core Speed do CPU-Z subiu de 1210 MHz para 2700 MHz!!!

Opa!!!

Executei novamente o teste do loop e agora os dois servidores estavam executando em 5 segundos.

A procedure de teste do cliente passou a rodar em 20 segundos nos dois servidores.

Pronto!!! A configuração do SO estava economizando energia e reduzindo a capacidade de processamento do servidor.

Agora o Diretor pode ficar tranquilo que a performance do servidor novo não será pior que do servidor antigo.

O Glenn Berry disse em um dos posts abaixo, que fica triste em dizer para habilitarmos essa opção de High Performance devido a um maior consumo de energia, mas é o indicado para servidores de banco de dados. Podemos economizar energia de outras formas, com virtualização ou consolidando várias instancias de SQL Server em um mesmo Hardware.

Segue alguns posts sobre o assunto para leitura:

É uma opção bem simples de ser alterada que fez uma grande diferença na performance do ambiente.

 
Gostou dessa dica?

Cadastre seu e-mail para receber novos Posts e curta minha Página no Facebook para receber Dicas de Leituras e Eventos sobre SQL Server.

Confira mais experiências do Dia a Dia de um DBA no meu Treinamento de Tarefas do Dia a Dia de um DBA.

Abraços,

Fabrício Lima

MCITP – Database Administrator

Consultor e Instrutor SQL Server

Trabalha com SQL Server desde 2006

24 thoughts on “Casos do Dia a Dia: Comprei um servidor melhor e o SQL Server está mais lento! Como pode???

  1. Excelente o post, muito bem detalhado e explicado, porém estou com 1 dúvida, se o novo servidor é mais robusto, não deveria executar a Procedure em menor tempo ?

    1. Obrigado Igor,

      Mais memória não faz diferença nesse caso pois pouca memória já é suficiente para deixar tudo em cache. Disco também não. CPU também não pois tem CPU sobrando para processar essa procedure.

      O servidor mais robusto fará uma diferença grande quando tiver TODO o sistema funcionando com muitas requisições ao mesmo tempo. Aí sim esse hardware melhor fará muita diferença.

  2. Isso já me quebrou muito a cabeça. Hoje em dia é uma das primeiras configucão que verifico.
    Difícil chegar a esta configuração sem conhecer o impacto dela. Principalmente em uma “crise” após uma migração mau homologada.

    Parabéns pelo trabalho.

  3. Grande Fabricio,
    mais uma vez obrigado por compartilhar não só o seu conhecimento, mas a sua experiência.
    São esses pequenos detalhes que fazem a diferença.
    Vlw!

  4. Muito bom, várias vezes já identifiquei problemas que afetam a performance de banco de dados, porém que não são causados por algum tipo de configuração do banco ou query não otimizada, mas sim por elementos “externos” que geram impacto.

  5. Grande Fabricio, acompanho teus posts a um bom tempo… e esse me deixou intrigado… rs
    Assim… Possuímos 2 ambientes na empresa (Produção e Homologação). Agora o bacana… Rodei a query que passou em ambos os servers (produção 7s, homologação 5s).
    Homologação 2 segundos mais rápido que o produção (Detalhe que o produção e no mínimo 3x mais maquina que o homologação). Olhei o parâmetro da energia e já estão em Desempenho máximo. Alguma outra dica ???

  6. Fabrício, perfeito a sua dica. Juro que não sabia disso. Vou colocar nas rotinas de configuração dos meus ambientes.

    Abraços e parabéns!

    1. Olá Marcelo,

      Não consigo te dizer sem encontrar um documento sobre isso ou realizar um teste em uma VM.

      Mas acredito que possa influenciar sim porque o windows da VM pode querer economizar recursos…

      Na dúvida, configuraria assim na máquina virtual também. Mas se conseguir fazer um teste, seria bacana.

      1. Oi Fabricio. Falei com meu gestor na empresa e essa opção foi configurada nas VM’s que temos.
        Só preciso coletar a evidência da alteração da velocidade do Core. Assim que conseguir publico pra vc.
        Obrigado!

  7. Fabrício esse Post realmente merece uma grande atenção na hora de criar um servidor de BD, vou incluir com urgência no meu checklist. Obrigado por compartilhar mais essa sua experiência.
    Abs

  8. Fabricio,
    Grande dica passamos por isso esses dias, porem ao alterar a opção de energia para High performance via interface gráfica não estava sendo alterado, tivemos que alterar a configuração no registro do servidor.

    Para verificar o a configuração eu usei a seguinte query:

    Guid dos planos:
    ———————————–
    Power Scheme GUID: 381b4222-f694-41f0-9685-ff5bb260df2e (Balanced) *
    Power Scheme GUID: 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c (High performance)
    Power Scheme GUID: a1841308-3541-4fab-bc81-f71556f20b4a (Power saver)

    DECLARE
    @value VARCHAR(64),
    @key VARCHAR(512) = ‘SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\’
    + ‘ControlPanel\NameSpace\{025A5937-A6BE-4686-A844-36FE4BEC8B6D}’;

    EXEC master..xp_regread
    @rootkey = ‘HKEY_LOCAL_MACHINE’,
    @key = @key,
    @value_name = ‘PreferredPlan’,
    @value = @value OUTPUT;

    SELECT @value;

    381b4222-f694-41f0-9685-ff5bb260df2e
    Ai tiver que alterar direto no registro para funcionar.

  9. Excelente Post! Parabéns pela clareza. Entretanto me surgiu uma dúvida de amador: “Já que o hardware do novo servidor é muito melhor que o do servidor antigo, não seria correto imaginar que o novo servidor deveria apresentar um desempenho melhor que o antigo e não apenas igual?”

    1. Obrigado Alysson,

      Mais memória não faz diferença nesse caso pois pouca memória já é suficiente para deixar tudo em cache. Disco também não porque os dois são SSD. CPU também não pois tem CPU sobrando para processar essa procedure.

      O servidor mais robusto fará uma diferença grande quando tiver TODO o sistema funcionando com muitas requisições ao mesmo tempo. Aí sim esse hardware melhor fará muita diferença.

      E é o que está acontecendo. Falei com esse cliente ontem e a performance do ambiente melhorou após a migração.

      O teste correto seria executar a procedure N vezes ao mesmo tempo.

Deixe uma resposta

%d blogueiros gostam disto: