Olá, pessoal, tudo bem? Espero que sim, meu nome é Matheus Macedo e eu sou acelera jovem aqui na Dataside, e nesse artigo vou mostrar para vocês como configurar o CPU em uma instância no SQL Server.
1. Affinity Mask (Configurando quantas CPUs minha instância vai enxergar)
2. Max Degree of Parallelism (MAXDOP)
3. Cost Threshold for parallelism
Affinity Mask
Antes de tudo, precisamos configurar quantos cores lógicos minha instância no SQL Server vai enxergar, para fazer isso precisamos entender o que é o Affinity Mask e para o que ele serve, vou fazer uma breve explicação.
No SQL Server, a opção Affinity Mask pode ser configurada sem a necessidade de reiniciar a instância do SQL Server por interface ou por comandos utilizando RECONFIGURE.
As alterações no Affinity Mask ocorrem em tempo real, ou seja, posso atribuir mais CPUs para que o SQL SERVER utilize ou posso limitar a quantidade. Imagine esse cenário, se uma instância nova do SQL Server for adicionada ao servidor de 8 cores, pode ser o caso de eu alterar a configuração do Affinity Mask para cada instância utilizar processadores diferentes, por exemplo, cada um com 4 cores, sendo assim, minha instância 1 não irá tocar no CPU que configurei para instância 2 e vice versa.
Como configurar o Affinity Mask na nossa instância SQL Server?
1. Vamos clicar com o botão direito na instância desejada e clicar em “Properties” ou se o seu SSMS estiver em português “Propriedades”:
2. Após isso vamos em “Processors” ou “Processadores”:
3. Aqui podemos configurar com quantos CPUs nossa instância vai trabalhar, por padrão vem com a opção “Automatically set processor Affinity mask for all processors”, caso queira mudar clicamos na caixa para desabilitar e selecionamos quantos processadores nossa instância vai trabalhar.
Bom agora que aprendemos como configurar o Affinity Mask na nossa instância, como eu vejo quantos CPUs ela está enxergando? Além de podermos consultar essa própria tela, vamos utilizar uma tabela do sistema chamada sys.dm_os_schedulers, conseguimos retornar quantas CPUs nossa máquina tem e quais estamos utilizando, para esse exemplo eu configurei o SQL Server para enxergar apenas 2 CPUs:
Query:
SELECT
scheduler_id,
cpu_id,
current_tasks_count,
runnable_tasks_count,
current_workers_count,
active_workers_count,
work_queue_count,
status
FROM sys.dm_os_schedulers
WHERE scheduler_id < 255
order by status
Resultado:
MAXDOP (Max degree of parallelism)
Afinal de contas o que é e para que serve o MAXDOP?
Quando uma instância do SQL Server é executada em um computador que possui mais de um core, o mecanismo de Banco de Dados detecta se o paralelismo pode ser usado. O Grau de paralelismo define a quantidade de cores que uma query poderá usar para tornar a consulta mais rápida, a decisão se uma query irá executar em paralelo ou não é também definida pelo “Cost Treshold of Parallelism” que iremos ver no tópico seguinte.
Bom após ver o que é o MAXDOP e para que ele serve vamos ver algumas considerações antes de configurar.
A definição do MAXDOP como 0 permite que o SQL Server use todos os processadores disponíveis, até 64 processadores. No entanto esse não é o valor recomendado para a maioria dos casos.
Para suprimir a geração de planos paralelos, defina o MAXDOP como 1. Defina o valor como um número de 1 a 32.767 para especificar o número máximo de núcleos de processador que podem ser usados durante uma execução de consulta. Se um valor maior do que o número de processadores disponíveis for especificado, o número real de processadores disponíveis será usado. Se o ambiente tiver apenas um processador, o valor de MAXDOP será ignorado
Agora que já sabemos por cima como funciona o MAXDOP, vamos a parte que interessa que é a configuração na nossa instância SQL Server.
1. Vamos clicar com o botão direito na nossa instância e clicar em “Properties” ou “Propriedades” caso seu SQL esteja em português.
2. Clicamos em “Advanced” ou “Avançado”:
3. Na aba “Parallelism” ou “Paralelismo”, procuramos por “Max Degree Of Parallelism”, nessa parte antes de colocar algum valor temos que saber quantos CPUs o cliente tem e qual o recomendado para ele.
Obs.: Nessa parte eu mostrei para vocês onde muda o valor do MAXDOP, o foco aqui é saber o porquê utilizar e saber onde mudar, mas antes de sair mudando em todos os ambientes que você trabalha precisamos saber a forma que o cliente trabalha para assim fazer a mudança.
Em geral, existe essa recomendação da Microsoft:
Cost Threshold
O que é o Cost Threshold e para o que ele é usado?
Antes de executar uma query o SQL SERVER gera um plano de execução. Todo plano de execução tem um custo baseado em estimativas de CPU e I/O que será utilizado para executar a query. Este custo pode ser identificado no primeiro operador do plano de execução como destacado na imagem abaixo:
A opção cost threshold for paralleslim especifica a partir de que custo o SQL SERVER deve começar avaliar a possibilidade de executar a consulta em paralelo, reparem que eu reforcei que é a possibilidade, pois nem sempre executar uma consulta em paralelo irá gerar ganhos.
Então no meu caso, para o print anterior, caso eu defina que o cost threshold é de 50, ele não irá nem avaliar a possibilidade de executar em paralelo pois meu “Estimated Subtree Cost” é de 0.
A opção cost threshold pode ser definida como qualquer valor de 0 a 32767.
Agora que sabemos para que ele serve vamos ver algumas limitações e restrições descritas pela Microsoft.
SQL Server ignora o valor do Cost Threshold nas seguintes condições:
Seu ambiente só tem um processador lógico
Só um único processador lógico está disponível para o SQL Server definido na opção de configuração Affinity Mask.
A opção MAXDOP está definida como 1.
Recomendações descritas pela Microsoft:
Em certos casos, pode ser escolhido um plano paralelo, embora o plano de custo da consulta seja menor do que o valor atual do cost threshold. Isso pode acontecer pois a decisão de usar um plano paralelo ou serial tem base em uma estimativa de custo fornecida anteriormente no processo de otimização.
Embora o valor padrão de 5 seja adequado para a maioria dos sistemas, um valor diferente pode ser adequado. Execute testes de aplicativos com valores superiores ou inferiores, se necessário, para otimizar o desempenho do aplicativo.
Configurando o Cost Threshold
Agora que já conhecemos um pouco sobre o Cost Threshold, vamos aprender onde configurar ele na nossa instância.
1. Botão direito na nossa instância e clicamos em “Properties” ou “Propriedades” caso seu SQL esteja em português:
2. Vamos em “Advanced” ou “Avançado”:
3. Na aba “Parallelism” ou “Paralelismo” procuramos por Cost Threshold for Parallelism, e aqui definimos o valor que desejamos.
Obs.: Vale ressaltar novamente que o intuito desse artigo é apenas mostrar onde modificar e como funciona cada opção apresentada, qualquer modificação terá que ser conversada e resolvida com o cliente.
Bom esse foi o meu primeiro artigo aqui para a Dataside, espero que de alguma forma eu possa ajudar quem está começando com um pouco do que aprendi nessa minha jornada no mundo DBA, e muito obrigado por ler até o final, e vamos pra cima 💙🚀 !!