Results for tag "power-plan"

2 Articles

Desempenho do Processador x Desempenho do SQL Server – Parte 2

Post 2/3. Este post é parte da série: Desempenho do Processador x Desempenho do SQL Server

Olá caro leitor,

Esta é mais uma série de posts, e o assunto da vez é o desempenho do processador. No post anterior, vimos alguns conceitos básicos sobre velocidade da CPU. Agora vamos aplicar um pouco desses conceitos no SQL Server e observar alguns efeitos na prática.

Revisão:

  • Clock = dispositivo da CPU que liga e desliga em uma certa frequência (clock tick)
    • 1 Hertz = 1 vez por segundo
    • 1 KHz = Mil vezes por segundo
    • 1 MHz = Um  milhão de vezes por segundo
    • 1 GHz = 1 bilhão de vezes por segundo
  • Cada instrução leva X clocks ticks. Quanto mais rápido um processodor, mais rápida as instruções executam.

 

No caso de código SQL, uma infinidade de instruções são executadas, não somente para acessar os dados e fazer alguma operação em cima deles, mas também para:

  • verificar locks/latches
  • checar permissões
  • acionar disco, rede

São centenas de milhares de instruções sendo executadas por uma simples consulta SQL. Isto significa que qualquer alteração na velocidade da CPU, a query poderá ser impactada (para melhor, ou para pior).

Vamos fazer um simples exercício, baseado numa query simples como esta:

  • Imagine que a query acima gaste  10 instruções. E pra simplificar mais ainda, imagine que cada instrução desta gaste apenas 1 tick do nosso clock.
  • Imagine que essa query execute num incrível processador de 100 Hertz (isso mesmo, cem ticks por segundo)
  • Primeiro, calcule o tempo de um tick:
    • 1 tick = 1000ms/100
    • 10ms = Cada tick nesse nosso incrível processador gasta apenas 10 ms!
  • Ora, se nossa query gasta 10 ticks, e cada tick tem 10ms, então ela vai gastar 100 ms de CPU (10ms * 10 ticks = 100 ms).
  • NOTA MUITO IMPORTANTE:  Aqui é só uma simulação de um gasto SOMENTE de CPU. Não estou colocando outras variáveis, como disco, memória, rede, etc.

Um exemplo de uma query que gasta um número X de instruções. O tempo total de CPU, vai sempre depender da velocidade do processador

Quando otimizamos essa query, criando um índice, ou adicionando mais filtros, estamos reduzindo o número de instruções (ou escolhendo instruções que gastam menos tempo).  E por isso o tempo de CPU diminui. Por exemplo, imagine que após criar um índice, causando a leitura de menos dados, a query execute com  apenas 4 instruções, então o tempo, no processador de mesma velocidade, será de 40ms ( 10ms * 4 ticks).

Simulando a otimização da query. Por exemplo, saindo de um clustered index scan, para um index scan, poderia causar a execução de menos instruções, devido a um menor número de páginas, menos colunas, etc. Tudo isso impacta na quantidade de instruções no final.

Simples, não?

Velocidade do Processador na prática

Vamos fazer o seguinte: Vamos brincar com nosso processador e observar como a velocidade do mesmo impacta em nossas consultas.

Os processadores mais modernos permitem alterar sua velocidade dinamicamente para poupar energia. Um clock que opera a 2.5 GHz gasta mais energia do que o mesmo clock operando a somente 100 MHz. Geralmente, os sistemas operacionais nos fornecem várias opções de controlar o gerenciamento de energia do processador.

Vamos criar um simples banco de dados com uma tabela grande e alguma quantidade considerável de registros:

  • Este código simplesmente cria um banco novo, uma tabela neste banco e insere alguns registros aleatórios.
  • Eu faço CROSS JOINs entre várias instâncias da view “sys.objects” apenas para gerar um grande número de registros.
  • O abs(CHECKSUM(newid())) gera um número aleatório para cada linha.

Antes de executar alguma query, vamos garantir que nosso computador irá operar no seu potencial máximo:

  1. Procure as opções de energia do seu computador. Você pode digitar powercfg.cpl no menu iniciar.
  2. Irá abrir tela tela semelhante a esta:

  3. Clique em “Alterar configurações do plano”, no respectivo plano que está marcando com a bolinha preta (No meu caso, o plano se chama “Dell”).
  4. Na próxima tela, cliquem em “Alterar configurações de energia avançadas”:

  5. Na janela que abrir, procure por “gerenciamento de energia do processador”:
  6. Altere o valor de mínimo para 100. Certifique-se que o máximo esteja em 100%, caso contrário, ajuste também. Se você está usando notebook, mas ele está usando a bateria como fonte de energia, então faça as alterações na opção “Na Bateria”. Se quiser garantir, pode alterar a configuração tanto para bateria, quanto para tomada. Memorize os valores que estavam antes para voltar a configuração original depois, ok?
  7. Pronto, clique em Aplicar, depois ok.
  8. Agora observe no Gerenciador de Tarefas (caso utilize um gerenciador de tarefas de uma versão anterior ao 2012 do Windows, você pode baixar a ferramenta CPU-Z):

  9. A velocidade deverá ficar sempre maior ou igual ao “velocidade base”.

O quê esta opção fez? Nós apenas solicitamos que o nosso processador sempre trabalhe no máximo de velocidade possível. Com isso,  mais energia será gasta, porém, nosso processador nunca irá baixar a velocidade. No meu caso, meu processador consegue trabalhar em 3.1 GHz (3 bilhões de ticks por segundo).

Esse percentual de CPU que você configurou NÃO é o mesmo percentual de CPU reportado pela maioria das ferramentas de monitoramento, como o próprio gerenciador de tarefas, process explorer, perfmon, etc. Seu processador ainda poderá bater 100% de uso! Explicaremos melhor depois.

Pronto, acabamos de deixar o processador em seu desempenho máximo, vamos rodar uma consulta e observar o tempo de CPU. Utilize o seguinte comando para obter o tempo de CPU:

Agora, execute a seguinte query:

Na aba “Messages” observe o tempo da execução. Se você acabou de reiniciar a instância, execute novamente, para garantir que iremos fazer leitura somente de dados em memória. Você está interessado no valor da informação “Cpu Time”:

O primeiro grupo de informação é referente ao tempo de compilação/recompilação da query. Ele rodou abaixo de 1ms, e por isso exibe zero.

Já o segundo grupo, este sim nos interessa. Ele nos diz quanto de CPU a query gastou, através da informação “Cpu time”. Note que o valor é de 266ms.

Agora vamos reduzir o máximo do nosso processador pela metade, e observar o que acontece com nossa query. Acesse novamente o powercfg.cpl, e repita o procedimento:

  • Escolha alterar configuração do plano atual
  • Depois vá em alterar configurações de energia avançadas
  • Vá em gerenciamento de energia do processador
  • Coloque o mínimo e o máximo em 50% (lembre-se, se não estiver conectado na tomada, altere o da bateria).

Confirme no Gerenciador de tarefas, ou no CPU-Z, que a velocidade do clock diminuiu.

Diminuindo o clock do processador para 50% da sua velocidade. Não espere nunca uma redução de exatos 50%. Poderão sofrer algumas pequenas variações, porque isso depende do processador, do sistema operacional, etc.

 

Note que a velocidade do clock de meu processador caiu para 1.29 Ghz

Perceba que agora minha CPU estará rodando com cerca de metade da força. Como será que isso vai impactar no tempo da minha query?

Minha query saiu de 266ms para 594ms. Um aumento de 123% no consumo de CPU, e tempo da query.

Muito interessante como a velocidade da CPU pode afetar o tempo de execução das consultas. No próximo post vou explicar melhor o que aconteceu e falaremos de outras coisas mais!

Até lá!

Desempenho do Processador x Desempenho do SQL Server – Parte 1

Post 1/3. Este post é parte da série: Desempenho do Processador x Desempenho do SQL Server

A CPU é um dos recursos mais fundamentais, senão o mais fundamental, de um computador. É ali que todos os recursos de um computador são coordenados.  Este é o primeiro post de mais uma série onde vamos aprender conceitos básicos sobre velocidade de CPU e como podemos usar isso para análises simples em consultas de um SQL Server.

Hoje vamos obter um conhecimento fundamental sobre CPU antes de partir para o SQL Server!

Clocks e Hertz

Você já deve estar cansado de ver os termos “2.5 GHz”, “3.0 GHz”, etc. Mas você sabe, de fato, o que eles significam? Embora eu necessite de uma série exclusiva somente para este assunto, é necessário um simples entendimento:

  • Quanto maior este valor, mais rápido as instruções são executadas

Basicamente,  toda CPU tem um “clock“, que é um dispositivo que “liga” e “desliga”  X vezes por segundo.  Cada vez que esse dispositivo “liga”, nós dizemos que houve um “clock tick”, ou, apenas “tick”.  Esse é o valor que você vê nas especificações:

  • Um processador de 1 Hertz (1 Hz) significa que seu clock liga e delisga 1 vez por segundo (1 tick por segundo)
  • 1000 Hertz, são 1000 ticks por segundo. Aqui se pode aplicar as unidades do SI (Sistema Internacional de Medidas) : 1000 Hertz = 1 KHz (Kilo Hertz)
  • 1 milhão de Hertz, ou 1 MHz, significa 1 milhão de ticks por segundo.
  • 2.5 GHz (Giga Hertz) , significa 2.5 x  1 bilhão (Giga), que equivale a 2 bilhões e 500 milhões de vezes por segundo

Uma vez que a velocidade do processador dita quantos ticks temos em um segundo, então, podemos calcular quanto tempo dura um tick. Pode parecer confuso o que eu vou dizer agora, mas é apenas uma questão de lógica, pare e reflita.

Cada tick do clock, leva um tempo fixo. Nenhum tick leva mais ou menos tempo que o outro tick. Então, quanto mais lento o processador,  maior será o tempo de 1 tick.  Pense em números pequenos, que vai ajudar:

  • Em um processador de 2 Hertz (dois ticks por segundo), cada tick leva 500 ms (0.5 segundos)
  • Em um processador de 4 Hertz (quatro ticks por segundo), cada tick leva 250 ms ( 0.250 segundos)
  • Percebeu a fórmula mágica pra calcular o tempo de 1 tick?
    • Tempo de um Tick, em Milssegundos = 1000ms/<Número Hertz>
    • 2.5 MHz = 1000/2500000 = 0,0004 ms (1 tick = 400 nanossegundos)
    • 1.0 MHz = 1000/1000000 = 0,001 (1 tick = 1000 nanossegundos)
    • 2.5 GHz  resulta num tick muuuuuuuuuuuuuuuuuuito pequeno! faça as contas você mesmo!

 

As instruções que um processador pode executar, gastam N ticks (isso porque, grosseiramente falando, cada vez que o clock liga, ele aciona certos circuitos e sincroniza o processador com a placa mãe, etc.) . Isso vai depender de cada processador, e de cada instrução.  A velocidade da CPU dita o tempo de cada instrução:

Em uma cpu fictícia de 2 Hz, uma instrução que gastasse 1 tick, demoraria 500 ms para executar. Uma instrução que custasse dois ticks, levaria 1 segundo. E assim por diante…

Por que saber de tudo isso é importante?

Quando você traz esses conceitos para o sistema operacional, e para os seus programas, como o SQL server, fica fácil entender certas coisas. No caso de uma simples consulta SQL, você tem centenas de milhares de instruções executando.  Por exemplo, uma query como esta:

 

Pode causar a execução de milhares de instruções. Vai depender da quantidade de registros, tamanho, concorrência, etc. A questão é que, no final das contas, tudo se resume ao que a CPU irá fazer, e entender a velocidade do seu processador vai te ajudar a compreender certos “fenômenos” e até planejar melhor seu ambiente. Imagine como esta query seria afetada se o tempo de cada instrução dobrasse…

No próximo  post vou mostrar todos estes conceito na prática, quando você executa uma query no SQL Server!

Até lá!

UPDATE: Obrigado ao Luiz Vitor pelas indicações de correção no texto!
UPDATE 2: Muito obrigado José Diz pelas dicas, principalmente sobre o sistema internacional de medidas!