soft-NUMA (SQL Server)

Aplica-se a: SQL Server

Os processadores modernos têm vários núcleos por soquete. Cada soquete é representado, em geral, como um único nó NUMA. O mecanismo de banco de dados do SQL Server particiona diversas estruturas internas e particiona threads de serviço para cada nó NUMA. Com processadores contendo 10 ou mais núcleos por soquete, o uso de software NUMA para dividir nós NUMA de hardware geralmente aumenta a escalabilidade e o desempenho. Antes do SQL Server 2014 (12.x) SP2, o soft-NUMA (NUMA baseado em software) exigia a edição do Registro para adicionar uma máscara de afinidade de configuração de nó e era configurado no nível do host e não por instância. Desde o SQL Server 2014 (12.x) SP2 e o SQL Server 2016 (13.x), o soft-NUMA passou a ser configurado automaticamente no nível da instância do banco de dados quando o serviço Mecanismo de Banco de Dados do SQL Server é iniciado.

O soft-NUMA não dá suporte para processadores incluídos automaticamente.

Soft-NUMA automático

Com o SQL Server 2016 (13.x), sempre que o Mecanismo de Banco de Dados do SQL Server detecta mais de oito núcleos por nó NUMA ou soquete na inicialização, os nós soft-NUMA são criados automaticamente por padrão. Os núcleos de processador SMT (multithreading simultâneo) não são diferenciados ao contar núcleos físicos em um nó. Quando o número detectado de núcleos físicos for mais de oito por soquete, o Mecanismo de Banco de Dados do SQL Server criará nós soft-NUMA contendo o ideal de 8 núcleos, podendo reduzir para cinco ou aumentar para nove núcleos lógicos por nó. O tamanho do nó de hardware pode limitar-se a uma máscara de afinidade de CPU. O número de nós NUMA nunca excede o número máximo de nós NUMA permitidos.

Você pode desabilitar ou reabilitar o soft-NUMA usando a instrução ALTER SERVER CONFIGURATION (Transact-SQL) com o argumento SET SOFTNUMA. Alterar o valor dessa configuração requer a efetivação da reinicialização do mecanismo de banco de dados.

A figura a seguir mostra o tipo de informações sobre o soft-NUMA que aparece no log de erros do SQL Server, quando o SQL Server detecta nós NUMA com mais de oito núcleos físicos para cada nó ou soquete.

2016-11-14 13:39:43.17 Server      SQL Server detected 2 sockets with 12 cores per socket and 24 logical processors per socket, 48 total logical processors; using 48 logical processors based on SQL Server licensing. This is an informational message; no user action is required.
2016-11-14 13:39:43.35 Server      Automatic soft-NUMA was enabled because SQL Server has detected hardware NUMA nodes with greater than 8 physical cores.
2016-11-14 13:39:43.63 Server      Node configuration: node 0: CPU mask: 0x0000000000555555:0 Active CPU mask: 0x0000000000555555:0. This message provides a description of the NUMA configuration for this computer. This is an informational message only. No user action is required.
2016-11-14 13:39:43.63 Server      Node configuration: node 1: CPU mask: 0x0000000000aaaaaa:0 Active CPU mask: 0x0000000000aaaaaa:0. This message provides a description of the NUMA configuration for this computer. This is an informational message only. No user action is required.
2016-11-14 13:39:43.63 Server      Node configuration: node 2: CPU mask: 0x0000555555000000:0 Active CPU mask: 0x0000555555000000:0. This message provides a description of the NUMA configuration for this computer. This is an informational message only. No user action is required.
2016-11-14 13:39:43.63 Server      Node configuration: node 3: CPU mask: 0x0000aaaaaa000000:0 Active CPU mask: 0x0000aaaaaa000000:0. This message provides a description of the NUMA configuration for this computer. This is an informational message only. No user action is required.

Observação

Do SQL Server 2014 (12.x) SP 2 em diante, use o sinalizador de rastreamento 8079 para permitir que o SQL Server use soft-NUMA automático. Começando com SQL Server 2016 (13.x), esse comportamento é controlado pelo mecanismo e o sinalizador de rastreamento 8079 não tem nenhum efeito. Para obter mais informações, veja DBCC TRACEON – sinalizadores de rastreamento.

Soft-NUMA manual

Para configurar o SQL Server manualmente para usar o soft-NUMA, desabilite o soft-NUMA automático e edite o Registro para adicionar uma máscara de afinidade de configuração de nó. Ao usar esse método, a máscara do soft-NUMA pode ser declarada como uma entrada de registro binária, DWORD (hexadecimal ou decimal) ou QWORD (hexadecimal ou decimal). Para configurar mais que as primeiras 32 CPUs, use os valores do Registro QWORD ou BINARY (os valores QWORD não podem ser usados antes do SQL Server 2012 (11.x)). Depois de modificar o Registro, você precisará reiniciar o Mecanismo de Banco de Dados para que a configuração do soft-NUMA entre em vigor.

Dica

As CPUs são numeradas a partir de 0.

Aviso

A edição incorreta do Registro pode danificar seriamente o sistema. Antes de fazer alterações no Registro, é recomendável fazer backup dos dados importantes no computador.

Considere o exemplo de um computador com oito CPUs, que não tem NUMA de hardware. Três nós soft-NUMA são configurados.
A instância A Mecanismo de Banco de Dados é configurada para usar as CPUs 0 a 3. Uma segunda instância do Mecanismo de Banco de Dados está instalada e configurada para usar as CPUs 4 a 7. O exemplo pode ser visualmente representado como:

CPUs         0  1  2  3  4  5  6  7
Soft-NUMA   <-N0-><-N1-><----N2---->
SQL Server  <instance A><instance B>

A instância A, que apresenta E/S significativa, agora tem dois threads de E/S e um thread de gravador lento. A instância B, que executa operações de processamento intenso, tem apenas um thread de E/S e um thread de gravador lento. Diferentes quantidades de memória podem ser atribuídas às instâncias, mas ao contrário do NUMA de hardware, ambas recebem memória do mesmo bloco de memória do sistema operacional e não há nenhuma afinidade do processador com a memória.

O thread de gravador lento é vinculado à exibição do SQLOS dos nós de memória NUMA físicos. Por isso, aquilo que o hardware apresenta como os nós NUMA físicos equivale ao número de threads de gravador lento criados. Para obter mais informações, confira Como funciona: Como funcionam o soft NUMA, o thread de término de E/S, os trabalhadores de gravador lento e os nós de memória.

Observação

As chaves do Registro Soft-NUMA não são copiadas quando você atualiza uma instância do SQL Server.

Defina a máscara de afinidade de CPU

Execute a instrução a seguir na instância A para configurá-la para usar as CPUs 0, 1, 2 e 3, definindo a máscara de afinidade da CPU:

ALTER SERVER CONFIGURATION
SET PROCESS AFFINITY CPU = 0 TO 3;

Execute a instrução a seguir na instância B para configurá-la para usar as CPUs 4, 5, 6 e 7, definindo a máscara de afinidade da CPU:

ALTER SERVER CONFIGURATION
SET PROCESS AFFINITY CPU = 4 TO 7;

Mapear nós NUMA de software para CPUs

Usando o programa Editor do Registro (regedit.exe), adicione as duas chaves do Registro seguintes para mapear o nó soft-NUMA 0 às CPUs 0 e 1, o nó soft-NUMA 1 para as CPUs 2 e 3 e o nó soft-NUMA 2 para as CPUs 4, 5, 6 e 7.

Dica

Para especificar as CPUs 60 a 63, use um valor QWORD de F000000000000000 ou um valor BINARY de 1111000000000000000000000000000000000000000000000000000000000000.

No exemplo a seguir, suponha que você tenha um servidor DL580 G9, com 18 núcleos por soquete (em 4 soquetes) e cada soquete esteja em seu próprio grupo K. Uma configuração de soft-NUMA que você poderia criar seria algo semelhante a isto: seis núcleos por nó, três nós por grupo, quatro grupos.

Exemplo para uma Instância do SQL Server com vários Grupos K Tipo Nome do valor Dados do valor
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node0 DWORD CPUMask 0x3f
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node0 DWORD Group 0
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node1 DWORD CPUMask 0x0fc0
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node1 DWORD Group 0
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node2 DWORD CPUMask 0x3f000
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node2 DWORD Group 0
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node3 DWORD CPUMask 0x3f
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node3 DWORD Group 1
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node4 DWORD CPUMask 0x0fc0
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node4 DWORD Group 1
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node5 DWORD CPUMask 0x3f000
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node5 DWORD Group 1
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node6 DWORD CPUMask 0x3f
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node6 DWORD Group 2
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node7 DWORD CPUMask 0x0fc0
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node7 DWORD Group 2
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node8 DWORD CPUMask 0x3f000
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node8 DWORD Group 2
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node9 DWORD CPUMask 0x3f
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node9 DWORD Group 3
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node10 DWORD CPUMask 0x0fc0
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node10 DWORD Group 3
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node11 DWORD CPUMask 0x3f000
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\NodeConfiguration\Node11 DWORD Group 3

Metadados

Você pode usar as DMVs a seguir para exibir o estado e a configuração atuais do soft-NUMA.

Embora seja possível exibir o valor de execução do soft-NUMA automático usando sp_configure (Transact-SQL), não é possível alterar seu valor usando sp_configure. Você deve usar a instrução ALTER SERVER CONFIGURATION (Transact-SQL) com o argumento SET SOFTNUMA.