Por que o SQL Server não utiliza toda CPU da sua VM

Eficiente (adj.) – Quando a tarefa é executada da melhor maneira possível, com o menor desperdício de tempo, esforço e recursos.
Eficaz (adj.) – É algo adequado para atingir um propósito, de modo a alcançar o resultado pretendido ou esperado.

Olá, pessoal! Bem-vindos à mais uma aula de português mais um post sobre SQL Server e dessa vez é pra falar sobre um assunto não tão bacana: desperdício de recursos computacionais.

A ineficiência

Uma desatenção que vejo algumas vezes é em relação à configuração inadequada de CPUs em VMs SQL Server com edições Web ou Standard, porque essas edições limitam, de forma automática, a utilização de CPU pelo SQL Server dependendo da quantidade de cores e sockets configurados na VM.

Repare a documentação:

A partir do SQL Server 2016, para a versão Standard, o SQL Server limita de forma automática em: 4 sockets ou 24 cores (sem considerar hyper-threading), o que for menor. Já para a versão Web, o limite é em: 4 sockets ou 16 cores (sem considerar hyper-threading), o que for menor.

Em versões anteriores à 2016, para a versão Standard, o SQL Server limita de forma automática em: 4 sockets ou 16 cores (sem considerar hyper-threading), o que for menor, e o mesmo limite se aplica à edição Web.

Muitos não se atentam à essa limitação na hora de provisionar as VMs que vão hospedar o SQL Server, dessa forma a instância não utiliza todos os cores provisionados para a VM e você acaba desperdiçando recursos. E o pior: às vezes essas instâncias estão sofrendo com pressão de CPU.

O diagnóstico

Como sei se sofro deste problema? Caso haja essa limitação você verá uma mensagem como essa nos logs da instância:

SQL Server detected 12 sockets with 1 cores per socket and 1 logical processors per socket, 12 total logical processors; using 4 logical processors based on SQL Server licensing. This is an informational message; no user action is required.

De 12 você está usando somente 4 (!)

Outra forma de verificar é executando a seguinte query:

SELECT * FROM sys.dm_os_schedulers WHERE is_online = 0 AND scheduler_id < 255

Com essa query verificamos se existe algum scheduler offline (is_online = 0). Se essa query retornar alguma coisa, bad news. É lógico que você pode ter feito isso de forma intencional, por exemplo, configurando processor affinity mask. Ou já sabia sobre essa limitação automática e quis deixar recursos livres para alguma outra coisa que rode na máquina. Se esse não for o caso, continue lendo esse post.

Repare na seguinte configuração:

Nessa VM eu tenho 5 sockets com 2 cores por socket, ou seja, 10 cores no total. Trata-se de um SQL Server 2016 Standard e se eu executo a query que postei acima, vejo o seguinte:

Como era de se esperar, 2 cores estão offline e não podem ser usados pelo SQL Server pois o limite para esta versão é de 4 sockets ou 24 cores, lembra? Nessa instância eu não tenho mais que 24 cores, porém tenho mais que 4 sockets. Sendo assim: 4 sockets * 2 cores = 8 cores utilizados, fazendo com que os outros 2 fiquem offline no SQL Server.

Outro caso

Mais um caso de exemplo. E esse é pior:

Nessa VM tenho 12 sockets com 1 core por socket, totalizando 12 cores e nela está instalado um SQL Server 2017 Standard.

Como já vimos, utilizaremos somente 4 sockets desses 12. Sendo assim, 4 (sockets) * 1 core (por socket) = 4 cores sendo utilizados. Ou seja, 8 (!) cores offline 67% de "perda". Em uma VM que possui só uma instância e é dedicada a banco de dados, isso não é nada bom.

A correção

Peça ao seu time de infraestrutura/virtualização para adequar o esquema de CPUs da VM aos limites do SQL Server. Para isso basta garantir que o número de sockets e a distribuição de cores por socket esteja de acordo com os limites da sua edição. Fácil né? Por exemplo, no último caso que apresentei, apenas solicitei que os 12 cores fossem distribuídos em 4 sockets, ao invés de 12. Muito simples. Entretanto, o lado ruim disso é que você vai ter algum down-time, então é bom planejar direitinho :)

Post criado 10

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Posts Relacionados

Comece a digitar sua pesquisa acima e pressione Enter para pesquisar. Pressione ESC para cancelar.

De volta ao topo