Pool de buffers híbrido

Aplica-se a: SQL Server 2019 (15.x) e versões posteriores

O pool de buffers híbrido permite que objetos do pool de buffers façam referência a páginas de dados em arquivos de banco de dados que residem em dispositivos PMEM (memória persistente), em vez de precisar efetuar fetch de cópias das páginas de dados do disco e armazená-las em cache na DRAM volátil. Esse recurso foi introduzido no SQL Server 2019 (15.x) e foi aprimorado ainda mais no SQL Server 2022 (16.x).

Diagrama mostrando o pool de buffers, com e sem o pool de buffer híbrido habilitado.

Os dispositivos de memória persistente (PMEM) são endereçáveis por byte e se um sistema de arquivos com reconhecimento de memória persistente do DAX (acesso direto) (como XFS, EXT4 ou NTFS) for usado, os arquivos no sistema de arquivos poderão ser acessados usando as APIs de sistema de arquivos usuais no sistema de arquivos. Como alternativa, o SQL Server pode executar o que é conhecido como operações de carregamento e armazenamento em relação aos mapas de memória dos arquivos no dispositivo PMEM. Isso permite que aplicativos de reconhecimento de PMEM, como SQL Server, acessem arquivos no dispositivo sem atravessar a pilha de armazenamento tradicional.

O pool de buffers híbrido usa essa capacidade de execução de operações de carregamento e armazenamento em arquivos mapeados de memória, para usar o dispositivo PMEM como um cache para o pool de buffers e um local de armazenamento para os arquivos de banco de dados. Isso cria a situação única em que uma leitura lógica e uma leitura física se tornam essencialmente a mesma operação. Os dispositivos de memória persistentes podem ser acessados por meio do barramento de memória, assim como a DRAM volátil normal.

Por padrão, somente as páginas de dados limpas são armazenadas em cache no módulo PMEM para o pool de buffers híbrido. Para que uma página seja modificada e marcada como suja, ela deve ser copiada do dispositivo PMEM para um pool de buffers DRAM, modificada e, eventualmente, uma cópia da página modificada é gravada do DRAM de volta no módulo PMEM, momento em que ela pode ser marcada como limpa novamente. Esse processo ocorre usando operações normais em segundo plano, como ponto de verificação ou gravador lento, como se o módulo PMEM fosse um dispositivo de bloco padrão.

O recurso de pool de buffers híbrido está disponível para o Windows e o Linux. O dispositivo PMEM precisa usar um sistema de arquivos que dá suporte ao DAX (DirectAccess). Os sistemas de arquivos XFS, EXT4 e NTFS têm suporte para extensões DAX, que fornecem acesso ao sistema de arquivos diretamente do espaço do usuário. O SQL Server detectará se arquivos de dados de qualquer banco de dados residirem em um dispositivo de disco PMEM corretamente configurado e executará automaticamente o mapeamento de memória necessário dos arquivos de banco de dados após a inicialização do banco de dados ou sempre que um banco de dados for anexado, restaurado ou criado.

Para obter mais informações, consulte:

Habilitar o pool de buffers híbrido

O SQL Server 2019 (15.x) introduz a DDL (Dynamic Data Language) para controlar o pool de buffers híbrido.

O seguinte exemplo habilita o pool de buffers híbrido em uma instância do SQL Server:

ALTER SERVER CONFIGURATION SET MEMORY_OPTIMIZED HYBRID_BUFFER_POOL = ON;

Por padrão, o pool de buffers híbrido é desabilitado no escopo da instância. Para a alteração de configuração entrar em vigor, a instância do SQL Server deverá ser reiniciada. Uma reinicialização é necessária para facilitar a alocação de páginas suficientes de hash para levar em conta a capacidade total de PMEM no servidor.

O exemplo a seguir habilita o pool de buffers híbrido em um banco de dados específico.

ALTER DATABASE <databaseName> SET MEMORY_OPTIMIZED = ON;

Por padrão, o pool de buffers híbrido está habilitado no escopo do banco de dados.

Desabilitar o pool de buffers híbrido

O exemplo seguinte desabilita o pool de buffers híbrido no nível da instância:

ALTER SERVER CONFIGURATION SET MEMORY_OPTIMIZED HYBRID_BUFFER_POOL = OFF;

Por padrão, o pool de buffers híbrido é desabilitado no nível da instância. Para que essa alteração entre em vigor, a instância deve ser reiniciada. Esse reinício garante que páginas de hash suficientes sejam alocadas para o pool de buffers, já que a capacidade da PMEM no servidor agora precisa ser considerada.

O exemplo a seguir desabilita o pool de buffers híbrido em um banco de dados específico.

ALTER DATABASE <databaseName> SET MEMORY_OPTIMIZED = OFF;

Por padrão, o pool de buffer híbrido está habilitado no escopo do banco de dados e desabilitado no escopo do servidor.

Exibir a configuração do pool de buffers híbrido

Mostrar valor de tempo de execução

O exemplo a seguir retorna o status atual da configuração pool de buffers híbrido da instância.

SELECT * FROM
sys.server_memory_optimized_hybrid_buffer_pool_configuration;

O exemplo a seguir lista os bancos de dados e a configuração no nível de banco de dados para o pool de buffers híbrido (is_memory_optimized_enabled).

Você também pode montar ou formatar o módulo PMEM sem o DAX habilitado e tratá-lo como um dispositivo de bloco regular (ou seja, executar E/S por meio do kernel). Quando configurado dessa forma, nenhum módulo PMEM pode ser usado por SQL Server para executar operações endereçáveis por bytes (ou seja, todas as chamadas usarão drivers de espaço em kernel).

SELECT name, is_memory_optimized_enabled FROM sys.databases;

Pool de buffers híbrido com gravação direta

O pool de buffers híbrido com o comportamento Direct Write reduz o número de comandos memcpy que precisam ser executados em páginas de índice ou dados modificados que residem em dispositivos PMEM. Ele faz isso usando o buffer de log persistente durável como um meio de modificar a página sem precisar copiá-la para um dos pools de buffers DRAM. Em vez disso, as páginas em arquivos de banco de dados que residem em dispositivos PMEM são modificadas diretamente sem a necessidade de armazenar em cache em um pool de buffers DRAM e posteriormente realizar a liberação assíncrona em disco. Esse comportamento ainda respeita a semântica WAL (log write-ahead), já que os registros (log) no buffer de log de transações persistentes foram gravados ou protegidos em mídia durável. Ganhos consideráveis de desempenho foram observados para cargas de trabalho transacionais usando o pool de buffers híbrido e o buffer de log persistente juntos dessa maneira.

Para habilitar o modo de gravação direta, habilite o pool de buffers híbrido e o buffer de log persistente para um banco de dados e habilite o sinalizador de rastreamento de inicialização 809.

Melhores práticas para o pool de buffers híbrido

  • Ao formatar seu dispositivo PMEM no Windows, use o maior tamanho de unidade de alocação disponível para NTFS (2 MB no Windows Server 2019 e posterior) e verifique se o dispositivo foi formatado para o DAX (acesso direto).

  • Habilite a opção Bloquear páginas na memória no Windows.

  • Os tamanhos de arquivos devem ser um múltiplo de 2 MB (2 MB de módulo deve igual a zero).

  • Se a configuração com escopo do servidor para o pool de buffers híbrido for desabilitada, o recurso não será usado por nenhum banco de dados de usuário.

  • Com a configuração com escopo do servidor para o pool de buffers híbrido estiver habilitada, você poderá usar a configuração com escopo do banco de dados para desabilitar o recurso para bancos de dados de usuário individuais.

  • A partir de SQL Server 2019 (15.x) CU 3 (confira KB4538118), o cache de leitura foi habilitado por padrão, um processo em que as páginas mais quentes são controladas no pool de buffer híbrido e promovido automaticamente para um pool de buffers DRAM para melhorar o desempenho.

  • A partir de SQL Server 2022 (16.x) CU 1, o Direct Write é o comportamento padrão quando o pool de buffers híbrido é combinado com o buffer de log persistente. Isso deve melhorar o desempenho de quase todas as cargas de trabalho, mas há sempre uma chance de regressão e a CU deve ser testada minuciosamente antes de ser aplicada. Se você tiver regressão devido a essa alteração de comportamento, poderá reverter para o comportamento anterior usando o Sinalizador de rastreamento de inicialização 898.

  • A partir do SQL Server 2022 (16.x) CU 1, o Sinalizador de Rastreamento 809 será ignorado pelo SQL Server na inicialização. O Sinalizador de Rastreamento 809 e o Sinalizador de Rastreamento 898 se aplicam somente ao Windows e não se aplicam a SQL Server em Linux. Os sinalizadores de rastreamento só devem ser usados quando direcionados para fazer isso por um profissional certificado do Microsoft Server.