Configurar memória persistente (PMEM) para SQL Server no Linux
Aplica-se a:SQL Server - Linux
Este artigo descreve como configurar a memória persistente (PMEM) para SQL Server 2019 (15.x) e versões posteriores no Linux.
Visão geral
O SQL Server 2019 (15.x) introduziu muitos recursos na memória que usam memória persistente. Este artigo aborda as etapas necessárias para configurar a memória persistente para o SQL Server no Linux.
Observação
O termo esclarecimento foi introduzido para transmitir o conceito de trabalhar com um sistema de arquivos ciente de memória persistente. O acesso direto ao sistema de arquivos a partir de aplicativos de espaço do usuário é facilitado usando mapeamento de memória (mmap()
). Quando um mapeamento de memória para um arquivo é criado, o aplicativo pode emitir instruções de carregamento/armazenamento, ignorando completamente a pilha de E/S. Este é considerado um método de acesso a arquivos "esclarecido" da perspetiva do aplicativo de extensão de host (que é o código que permite que o SQLPAL interaja com o sistema operacional Windows ou Linux).
Criar namespaces para dispositivos PMEM
Configurar os dispositivos
No Linux, use o utilitário ndctl
.
- Instale
ndctl
para configurar o dispositivo PMEM. Você pode encontrá-lo aqui. - Use
ndctl
para criar um namespace. Os namespaces são intercalados entre PMEM NVDIMMs e podem fornecer diferentes tipos de acesso ao espaço do usuário para regiões de memória no dispositivo.fsdax
é o modo padrão e desejado para o SQL Server.
ndctl create-namespace -f -e namespace0.0 --mode=fsdax --map=dev
Escolhemos o modo fsdax
e estamos a usar a memória do sistema para armazenar metadados por página. Recomendamos o uso do --map=dev
. Esta opção armazena os metadados no namespace diretamente. Armazenar metadados na memória usando --map=mem
é experimental no momento.
Use ndctl
para verificar o namespace.
Segue exemplo de saída:
# ndctl list -N
{
"dev":"namespace0.0",
"mode":"fsdax",
"map":"dev",
"size":4294967296,
"sector_size":512,
"blockdev":"pmem0",
"numa_node":0
}
Criar e montar dispositivo PMEM
Por exemplo, com XFS
mkfs.xfs -f /dev/pmem0
mount -o dax,noatime /dev/pmem0 /mnt/dax
xfs_io -c "extsize 2m" /mnt/dax
Por exemplo, com EXT4
mkfs.ext4 -b 4096 -E stride=512 -F /dev/pmem0
mount -o dax,noatime /dev/pmem0 /mnt/dax
Considerações técnicas
- Alocação de bloco de 2 MB para XFS/EXT4, conforme descrito anteriormente
- O desalinhamento entre a alocação de blocos e a
mmap
resulta em ajuste automático para 4 KB. - Os tamanhos dos ficheiros devem ser múltiplos de 2 MB (módulo 2 MB)
- Não desative páginas transparentes grandes (THP) (ativadas por padrão na maioria das distribuições)
Uma vez que o dispositivo é configurado com ndctl
, criado e montado, você pode colocar arquivos de banco de dados nele ou criar um novo banco de dados.
Você pode armazenar os arquivos de dados do SQL Server (MDFS, NDFS) e arquivos tempdb
em um dispositivo PMEM quando configurado com o modo fsdax
usando o comando a seguir. Não utilize este armazenamento para armazenar os arquivos de log do SQL Server (LDFS), pois o log de transações precisa estar num armazenamento que ofereça garantias atómicas de setor.
ndctl create-namespace -f -e namespace0.0 --mode=fsdax --map=dev
Antes de definir a opção de mapa no comando anterior, lembre-se dos seguintes pontos:
- Para obter o melhor desempenho no acesso e atualização dessas entradas de página NVDIMM para este dispositivo, é preferível usar
-map=mem
- Se a capacidade do NVDIMM for muito grande (maior que 512 GB), defina o
–map=dev
, o que afetaria a taxa de transferência de E/S e prejudicaria o desempenho
Para os ficheiros de log do SQL Server em dispositivos PMEM, configure o(s) dispositivo(s) PMEM para usar setores/Tabela de Tradução de Bloco (BTT). Isso fornece a atomicidade de setor necessária para os ficheiros de log do SQL Server para esta tecnologia de dispositivos de armazenamento. Também recomendamos que você execute validações de desempenho de carga de trabalho. Você pode comparar o desempenho do log do SQL Server para sua carga de trabalho entre essa solução e os melhores SSDs NVMe da categoria e, em seguida, selecionar a solução que melhor atende às suas necessidades e oferece melhor desempenho.
ndctl create-namespace -f -e namespace0.0 --mode= sector
Desativar o comportamento de descarga forçada
Como os dispositivos PMEM são O_DIRECT
(E/S diretas) seguros, você pode desativar o comportamento de descarga forçada.
Observação
Um sistema de armazenamento pode garantir que todas as gravações em cache ou pré-gravadas sejam consideradas seguras e duráveis, assegurando que as gravações direcionadas ao dispositivo sejam mantidas em um meio que persista em caso de falhas do sistema, redefinições de interface e falhas de energia, sendo o próprio meio redundante em hardware.
Os ficheiros de base de dados (
.mdf
e.ndf
) e de log de transações (.ldf
) não usamwritethrough
ealternatewritethrough
por padrão no SQL Server 2017 (14.x) CU 6 e em versões posteriores, porque utilizam o comportamento de liberação forçada. O sinalizador de traço 3979 desativa o uso do comportamento de liberação forçada para arquivos de banco de dados e de log de transações e utiliza a lógicawritethrough
ealternatewritethrough
.Outros arquivos que são abertos usando
FILE_FLAG_WRITE_THROUGH
no SQL Server, como instantâneos de banco de dados, instantâneos internos para verificações de consistência de banco de dados (DBCC CHECKDB
), arquivos de rastreamento do profiler e arquivos de rastreamento de eventos estendidos, usam as otimizações dewritethrough
ealternatewritethrough
.
Para obter mais informações sobre as alterações introduzidas no SQL Server 2017 (14.x) CU 6, consulte KB 4131496. Para obter mais informações sobre acesso forçado à unidade (FUA) internos, consulte detalhes do FUA.
Capacidade do subsistema de E/S do SQL Server e de Acesso Forçado à Unidade (FUA)
Certas versões de distribuições Linux suportadas fornecem suporte para a capacidade de subsistema de E/S FUA, que fornece durabilidade de dados. O SQL Server usa o recurso FUA para fornecer E/S altamente eficientes e confiáveis para cargas de trabalho do SQL Server. Para obter mais informações sobre o suporte a FUA pela distribuição Linux e seu efeito no SQL Server, consulte SQL Server On Linux: Forced Unit Access (FUA) Internals.
O SUSE Linux Enterprise Server 12 SP5, o Red Hat Enterprise Linux 8.0 e o Ubuntu 18.04 introduziram suporte para o recurso FUA no subsistema de E/S. Se você estiver usando o SQL Server 2017 (14.x) 6 e versões posteriores, deverá usar a seguinte configuração para implementação de E/S eficiente e de alto desempenho com o FUA by SQL Server.
Use esta configuração recomendada se as seguintes condições forem atendidas.
SQL Server 2017 (14.x) Atualização Cumulativa 6 e versões posteriores
Distribuição Linux e versão que suporta a capacidade FUA (começando com Red Hat Enterprise Linux 8.0, SUSE Linux Enterprise Server 12 SP5 ou Ubuntu 18.04)
Sistema de arquivos XFS para armazenamento do SQL Server
Subsistema de armazenamento e/ou hardware compatível e configurado para capacidade FUA
Configuração recomendada:
Habilite o sinalizador de rastreamento 3979 como um parâmetro de inicialização.
Use mssql-conf para configurar
control.writethrough = 1
econtrol.alternatewritethrough = 0
.
Para quase todas as outras configurações que não atendem às condições anteriores, a configuração recomendada é a seguinte:
Habilite o Sinalizador de Rastreamento 3982 como um parâmetro de inicialização (que é o padrão para o SQL Server no ecossistema Linux) e certifique-se de que o Sinalizador de Rastreamento 3979 não esteja habilitado como um parâmetro de inicialização.
Use mssql-conf para configurar
control.writethrough = 1
econtrol.alternatewritethrough = 1
.
Suporte FUA para contêineres do SQL Server implantados no Kubernetes
O SQL Server deve usar armazenamento montado persistente e não
overlayfs
.O armazenamento deve usar o sistema de arquivos XFS e deve suportar FUA. Antes de habilitar essa configuração, você deve trabalhar com seu fornecedor de distribuição e armazenamento Linux para garantir que o sistema operacional e o subsistema de armazenamento suportem as opções FUA. No Kubernetes, você pode consultar o tipo de sistema de arquivos usando o seguinte comando, onde
<pvc-name>
é o seuPersistentVolumeClaim
:kubectl describe pv <pvc-name>
Na saída, procure o
fstype
definido como XFS.O nó de trabalho que hospeda os pods do SQL Server deve estar usando uma distribuição Linux e uma versão que suporte o recurso FUA (começando com o Red Hat Enterprise Linux 8.0, SUSE Linux Enterprise Server 12 SP5 ou Ubuntu 18.04).
Se as condições acima forem atendidas, você pode usar as seguintes configurações de FUA recomendadas.
Habilite o sinalizador de rastreamento 3979 como um parâmetro de inicialização.
Use mssql-conf para configurar
control.writethrough = 1
econtrol.alternatewritethrough = 0
.