Aumentando e reduzindo o pool de buffers no NUMA

Este tópico descreve como são atribuídas páginas de memória do pool de buffers usando NUMA (non-uniform memory access). Use estas informações para entender como o SQL Server usa NUMA e entender como interpretar os contadores do objeto de nó do buffer.

Distribuição de memória

Há um nó de memória SQL Server para cada nó NUMA físico. Os nós de memória aumentam independentemente uns dos outros, mas dividem a memória uniformemente. Para mostrar a distribuição de memória local vs. externa no SQL Server, este tópico usa um exemplo, supondo um computador com 16 GB (gigabytes) de memória. Outros aplicativos, incluindo o Windows, consomem um pouco da memória de cada nó, o SQL Server atribuiu um pouco de memória para seus processos fora do pool de buffers, e o SQL Server tem 10 GB de memória para atribuir ao pool de buffers. A memória do pool de buffers é dividida entre quatro nós NUMA físicos, N0, N1, N2 e N3, cada um com a seguinte memória local disponível:

  • N0 – 1 GB

  • N1 – 3 GB

  • N2 – 3 GB

  • N3 – 3 GB

Na configuração anterior, todos os nós serão alocados eventualmente e usarão 2.5 GB de memória; porém, o nó N0 terminará com 1 GB de sua própria memória e 1.5 GB de memória de outros nós.

Atribuição de memória na inicialização

Ao usar NUMA, o SQL Server recebe memória do sistema operacional a uma taxa comparável para um sistema não-NUMA, até mesmo se a memória livre inicial for distribuída desigualmente entre os nós. O pool de buffers tenta adquirir a quantidade máxima de memória local para cada nó; porém isso é difícil porque o Windows não tem uma API atualmente para alocar memória de um nó específico.

Como a memória é atribuída ao SQL Server, você pode observar que alguns nós recebem muitas páginas de outros nós NUMA (chamado páginas externas). Porém, essas páginas não são usadas durante o ramp-up porque podem ser transferidas freqüentemente ao nó proprietário e podem se tornar locais para aquele nó. Quando o valor da max server memory é alcançado, alguns nós podem ter memória externa, mas uma vez atingido o destino de memória, o pool de buffers tratará a memória local e a externa de forma idêntica. Por exemplo, sob pressão de memória, o pool de buffers não fará qualquer esforço para liberar páginas de memória externas antes de páginas de memória locais.

Limitando memória a nós específicos

Se o SQL Server estiver configurado para ser executado em um subconjunto de nós NUMA disponíveis, o pool de buffers não será limitado automaticamente à memória nesses nós. Nesse caso, use a opção max server memory para limitar o pool de buffers. Para obter informações sobre max server memory, consulte Opções de memória do servidor.

Liberando memória de um nó

Ao usar o NUMA, os valores da max server memory e da min server memory são uniformemente divididos entre os nós NUMA. Por exemplo, se você definir 16 GB para a max server memory no sistema com quatro nós, o pool de buffers alocará 4 GB de memória em cada nó. Se você fizer com que um dos nós fique offline alterando a configuração da affinity mask, a configuração da max server memory será redistribuída entre os nós restantes. Por exemplo, no exemplo anterior de quatro nós, se você fizer com que dois nós fiquem offline, os 8 GB de memória liberados serão distribuídos uniformemente entre os nós restantes. Considerando que o pool de buffers é capaz de usar páginas externas, a memória remota será utilizada se não houver memória suficiente nos nós restantes. Se você quiser que o SQL Server não use a memória dos nós que não estão mais sendo executados, diminua a configuração da max server memory depois de mover os nós offline.

Páginas externas

Nós funcionam de maneira eficiente independentemente uns dos outros. Todas as alocações e desalocações de memória do nó são feitas usando a memória associada ao nó. Porém, se um operador que estiver executando em um nó N1 precisar acessar uma página de banco de dados que já estiver na memória do nó N2, ele acessará a memória não-local.

Observando a memória local vs. externa no pool de buffers

O pool de buffers pode ser observado exibindo o objeto Nó do buffer. A memória total no pool de buffers do SQL Server é exibida como o contador Páginas de destino do objeto Gerenciador de buffer. A memória no pool de buffers de cada nó é exibida como o contador Páginas de destino do objeto Nó do buffer. A memória de outros nós é exibida como o contador Páginas externas. Para obter mais informações, consulte SQL Server, objeto Buffer Node e SQL Server, objeto Buffer Manager.

Cada nó verifica sua própria memória

Cada nó de memória tem seu próprio thread de gravador lento. Esse thread é chamado de pontos de verificação implícitos e explícitos. Considerando que um computador SMP (multiprocessamento simétrico) tem apenas um thread de ponto de verificação, quando vários threads usam NUMA, o resultado é um aumento da velocidade do ponto de verificação.

Comportamento do exame de tabela

Um exame de tabela que está sendo executado em um Nó N1 preencherá somente a memória associada ao nó N1, a menos que o exame esteja sendo executado em paralelo em CPUs de vários nós. Se o exame estiver sendo executado exclusivamente em um único nó, serão usadas apenas as páginas de buffer daquele nó. Isso ajuda a partição da carga de trabalho para um aplicativo.