Ir para o conteúdoIr para navegação de página: página anterior [tecla de acesso p]/próxima página [tecla de acesso n]
documentation.suse.com / Documentação do SUSE Linux Enterprise Desktop / Guia de Administração / Configuração de hardware / Memória persistente
Aplica-se a SUSE Linux Enterprise Desktop 15 SP6

37 Memória persistente

Este capítulo contém informações adicionais sobre como usar o SUSE Linux Enterprise Desktop com memória principal não volátil, também conhecida como Memória Persistente, que consiste em um ou mais NVDIMMs.

37.1 Introdução

Memória persistente é um novo tipo de armazenamento no computador que combina velocidades muito próximas às da RAM dinâmica (DRAM) ao endereçamento byte por byte da RAM, além da permanência das unidades de estado sólido (SSDs, Solid-State Drives).

No momento, a SUSE permite o uso de memória persistente com o SUSE Linux Enterprise Desktop em máquinas com as arquiteturas AMD64/Intel 64 e POWER.

Como a RAM convencional, a memória persistente é instalada diretamente nos slots de memória da placa-mãe. Dessa forma, ela é fornecida no mesmo fator de formato físico da RAM – como DIMMs. Eles são conhecidos como NVDIMMs: módulos de memória dupla em linha não voláteis.

No entanto, ao contrário da RAM, a memória persistente apresenta vários aspectos similares aos SSDs com base em flash. As duas são baseadas em formatos de circuito de memória de estado sólido, mas, apesar disso, ambas fornecem armazenamento não volátil: O conteúdo é mantido quando o sistema é desligado ou reiniciado. Para ambos os formatos de meio, a gravação de dados é mais lenta do que a leitura, e os dois suportam um número limitado de ciclos de regravação. Por fim, também como os SSDs, o acesso à memória persistente no nível do setor será possível se isso for mais adequado para um determinado aplicativo.

Modelos diferentes usam formatos distintos de meio de armazenamento eletrônico, como Intel 3D XPoint, ou uma combinação de NAND Flash e DRAM. Há novos formatos de RAM não volátil também em desenvolvimento. Isso significa que fornecedores e modelos diferentes do NVDIMM oferecem características distintas de durabilidade e desempenho.

Como as tecnologias de armazenamento envolvidas estão em um estágio inicial de desenvolvimento, o hardware de fornecedores diferentes pode impor limitações distintas. Dessa forma, as afirmações a seguir são uma generalização.

A memória persistente é até dez vezes mais lenta do que a DRAM, mas cerca de mil vezes mais rápida do que o armazenamento flash. Ela pode ser regravada byte por byte, em vez de usar o processo da memória flash de “apagar e regravar” todo o setor. Por fim, enquanto os ciclos de regravação são limitados, a maioria dos formatos de memória persistente pode processar milhões de regravações, em comparação com os milhares de ciclos do armazenamento flash.

Isso apresenta duas consequências importantes:

  • Com a tecnologia atual, não é possível executar um sistema apenas com memória persistente e, desse modo, atingir uma memória principal não volátil. Você deve usar uma mistura de RAM convencional e NVDIMMs. Os aplicativos e o sistema operacional serão executados na RAM convencional, com os NVDIMMs fornecendo o armazenamento suplementar rápido.

  • As características de desempenho da memória persistente dos diversos fornecedores significam que talvez seja necessário para os programadores prestar atenção nas especificações de hardware dos NVDIMMs em um servidor específico, incluindo quantos NVDIMMs existem e em quais slots de memória eles se encaixam. Isso afetará o uso do hipervisor, a migração de software entre máquinas host diferentes, entre outros aspectos.

Esse novo subsistema de armazenamento está definido na versão 6 do padrão ACPI. No entanto, o libnvdimm suporta NVDIMMs anteriores ao padrão, e eles podem ser usados da mesma maneira.

Dica
Dica: Memória persistente Intel Optane DC

A memória DIMMs Intel Optane pode ser usada em modos específicos:

  • No App Direct Mode, a memória Intel Optane é usada como armazenamento persistente rápido, uma alternativa aos dispositivos SSDs e NVMe. Os dados nesse modo são mantidos quando o sistema é desligado.

    O App Direct Mode é suportado desde o SLES 12 SP4.

  • No Memory Mode, a memória Intel Optane funciona como uma alternativa econômica e de alta capacidade à DRAM. Nesse modo, DIMMs DRAM separados atuam como cache para os dados acessados com mais frequência, enquanto a memória DIMMs Optane oferece grande capacidade de memória. No entanto, em comparação com sistemas apenas DRAM, esse modo é mais lento com cargas de trabalho de acesso aleatório. Se você executar aplicativos sem aprimoramentos específicos do Optane que se beneficiam desse modo, o desempenho da memória poderá diminuir. Os dados nesse modo são perdidos quando o sistema é desligado.

    O Memory Mode é suportado desde o SLES 15 SP1.

  • No Mixed Mode, a memória Intel Optane é particionada, para que possa atuar nos dois modos simultaneamente.

    O Mixed Mode é suportado desde o SLES 15 SP1.

37.2 Termos

Região

Uma região é um bloco da memória persistente que pode ser dividido em mais namespaces. Não é possível acessar a memória persistente de uma região sem primeiro alocá-la a um namespace.

Namespace

Uma única faixa de armazenamento continuamente endereçada e não volátil, comparável aos namespaces de SSD do NVM Express ou às Unidades Lógicas (LUNs, Logical Units) de SCSI. Os namespaces aparecem no diretório /dev do servidor como dispositivos de blocos separados. Dependendo do método de acesso necessário, os namespaces podem unir o armazenamento de vários NVDIMMs em grandes volumes ou permitir que ele seja particionado em volumes menores.

Modo

Cada namespace também tem um modo que define os recursos NVDIMM que estão habilitados para esse namespace. Os namespaces irmão da mesma região pai sempre terão o mesmo tipo, mas poderão ser configurados com modos diferentes. Veja a seguir os modos de namespace:

devdax

Modo Dispositivo-DAX. Cria um arquivo de dispositivo de caractere único ( /dev/daxX.Y ). Não requer a criação do sistema de arquivos.

fsdax

Modo Sistema de arquivos-DAX. Padrão, se nenhum outro modo for especificado. Cria um dispositivo de blocos (/dev/pmemX [.Y]) que suporta DAX para ext4 ou XFS.

sector

Para sistemas de arquivos legados que não efetuam checksum de metadados. Adequado para pequenos volumes de boot. Compatível com outros sistemas operacionais.

raw

Um disco de memória sem rótulo ou metadados. Não suporta a DAX. Compatível com outros sistemas operacionais.

Nota
Nota

O modo raw não é suportado pelo SUSE. Não é possível montar sistemas de arquivos em namespaces raw.

Tipo

Cada namespace e região tem um tipo que define como a memória persistente associada a esse namespace ou essa região pode ser acessada. Um namespace sempre tem o mesmo tipo que sua região pai. Há dois tipos diferentes: Memória Persistente, que pode ser configurada de duas formas diferentes, e o Modo de Bloco descontinuado.

Memória persistente (PMEM)

O armazenamento PMEM oferece acesso no nível de bytes, similar ao da RAM. Usando a PMEM, um único namespace pode incluir vários NVDIMMs intercalados, permitindo que todos sejam usados como um único dispositivo.

Há duas maneiras de configurar um namespace PMEM.

PMEM com DAX

Um namespace PMEM configurado para Acesso Direto (DAX) significa que o acesso à memória ignora o cache de página do kernel e vai direto para o meio. O software pode ler ou gravar diretamente cada byte do namespace de maneira separada.

PMEM com tabela de conversão de blocos (BTT, Block Translation Table)

Um namespace PMEM configurado para operar no modo BTT é acessado de setor por setor, como uma unidade de disco convencional, em vez do modelo endereçável por byte mais semelhante ao da RAM. Um mecanismo de tabela de conversão de lotes acessa as unidades do tamanho do setor.

A vantagem da BTT é a proteção de dados. O subsistema de armazenamento garante que cada setor seja completamente gravado no meio subjacente. Se um setor não puder ser completamente gravado (ou seja, se a operação de gravação falhar por algum motivo), todo o setor será revertido ao estado anterior. Portanto, um determinado setor não pode ser parcialmente gravado.

Além disso, acesso a namespaces BTT é armazenado em cache pelo kernel.

A desvantagem é que não é possível usar o DAX para namespaces BTT.

Modo de bloco (BLK)

O armazenamento do modo de bloco considera cada NVDIMM como um dispositivo separado. Seu uso foi descontinuado e não é mais suportado.

Exceto pelos namespaces devdax, todos os outros tipos devem ser formatados com um sistema de arquivos, assim como em uma unidade convencional. O SUSE Linux Enterprise Desktop suporta os sistemas de arquivos ext2, ext4 e XFS para esse modo.

Acesso direto (DAX)

O DAX permite que a memória persistente seja mapeada diretamente para o espaço de endereço de um processo, por exemplo, usando a chamada do sistema mmap.

Endereço físico DIMM (DPA)

Um endereço de memória como uma diferença na memória de um único DIMM; ou seja, começar do zero como o menor byte endereçável nesse DIMM.

Rótulo

Metadados armazenados no NVDIMM, como definições de namespace. É possível acessá-los usando DSMs.

Método específico do dispositivo (DSM)

Método ACPI para acessar o firmware em um NVDIMM.

37.3 Casos de uso

37.3.1 PMEM com DAX

Essa forma de acesso à memória não é transacional. Em caso de queda de energia ou outra falha no sistema, os dados podem não ser gravados no armazenamento. O armazenamento PMEM será adequado apenas se o aplicativo puder resolver a situação dos dados parcialmente gravados.

37.3.1.1 Aplicativos que se beneficiam de grandes quantidades de armazenamento endereçável por byte

Se o servidor for hospedar um aplicativo que possa usar diretamente grandes quantidades de armazenamento rápido byte por byte, o programador poderá usar a chamada do sistema mmap para inserir blocos da memória persistente diretamente no espaço do endereço do aplicativo, sem usar nenhuma RAM do sistema adicional.

37.3.1.2 Evitando o uso do cache de página do kernel

Evite usar o cache de página do kernel para manter o uso da RAM para o cache de página. Em vez disso, passe-o para os seus aplicativos. Por exemplo, a memória não volátil pode se dedicar a armazenar imagens da VM (Virtual Machine – Máquina Virtual). Como elas não são armazenadas em cache, isso reduz o uso do cache no host, permitindo mais VMs por host.

37.3.2 PMEM com BTT

Isso é útil quando você deseja usar a memória persistente em um conjunto de NVDIMMs como um pool do tipo disco de armazenamento rápido. Por exemplo, ao colocar o diário do sistema de arquivos na PMEM com BTT, você aumenta a confiabilidade da recuperação do sistema de arquivos após uma queda de energia ou outra interrupção repentina (consulte a Seção 37.5.3, “Criando um namespace PMEM com BTT”).

Para aplicativos, esses dispositivos aparecem como SSDs rápidas e podem ser usados como qualquer outro dispositivo de armazenamento. Por exemplo, a LVM pode ser colocada em camadas sobre a memória persistente e funcionará normalmente.

A vantagem do BTT é que a atomicidade de gravação do setor é garantida; portanto, até os aplicativos sofisticados que dependem da integridade dos dados continuarão funcionando. O relatório de erros da mídia funciona por meio dos canais de geração de relatórios de erros.

37.4 Ferramentas para gerenciamento de memória persistente

Para gerenciar a memória persistente, é necessário instalar o pacote ndctl. Esse procedimento também instala o pacote libndctl, que inclui um conjunto de bibliotecas de espaço do usuário para configurar os NVDIMMs.

Essas ferramentas funcionam por meio da biblioteca libnvdimm, que suporta três tipos de NVDIMM:

  • PMEM

  • BLK

  • PMEM e BLK simultâneos

O utilitário ndctl inclui um conjunto útil de páginas de man, que pode ser acessado com o comando:

> ndctl help subcommand

Para ver uma lista de subcomandos disponíveis, use:

> ndctl --list-cmds

Os subcomandos disponíveis incluem:

version

Exibe a versão atual das ferramentas de suporte do NVDIMM.

enable-namespace

Torna o namespace especificado disponível para uso.

disable-namespace

Impede que o namespace especificado seja usado.

create-namespace

Cria um novo namespace com base nos dispositivos de armazenamento especificado.

destroy-namespace

Remove o namespace especificado.

enable-region

Torna a região especificada disponível para uso.

disable-region

Impede que a região especificada seja usada.

zero-labels

Apaga os metadados de um dispositivo.

read-labels

Recupera os metadados do dispositivo especificado.

list

Exibe os dispositivos disponíveis.

help

Exibe as informações sobre como usar a ferramenta.

37.5 Configurando a memória persistente

37.5.1 Vendo o armazenamento NVDIMM disponível

É possível usar o comando ndctl list para listar todos os NVDIMMs disponíveis em um sistema.

No exemplo a seguir, o sistema tem três NVDIMMs, que estão em um único conjunto de canal triplo intercalado.

# ndctl list --dimms

[
 {
  "dev":"nmem2",
  "id":"8089-00-0000-12325476"
 },
 {
  "dev":"nmem1",
  "id":"8089-00-0000-11325476"
 },
 {
  "dev":"nmem0",
  "id":"8089-00-0000-10325476"
 }
]

Com um parâmetro diferente, o ndctl list também listará as regiões disponíveis.

Nota
Nota

As regiões podem não aparecer em ordem numérica.

Apesar de haver apenas três NVDIMMs, eles aparacem como quatro regiões.

# ndctl list --regions

[
 {
  "dev":"region1",
  "size":68182605824,
  "available_size":68182605824,
  "type":"blk"
 },
 {
  "dev":"region3",
  "size":202937204736,
  "available_size":202937204736,
  "type":"pmem",
  "iset_id":5903239628671731251
  },
  {
   "dev":"region0",
   "size":68182605824,
   "available_size":68182605824,
   "type":"blk"
  },
  {
   "dev":"region2",
   "size":68182605824,
   "available_size":68182605824,
   "type":"blk"
  }
]

O espaço está disponível em dois formatos diferentes: como três regiões separadas de 64 do tipo BLK ou como uma região combinada de 189 GB do tipo PMEM, que apresenta todo o espaço nos três NVDIMMs intercalados como um único volume.

Observe que o valor exibido para available_size é igual ao de size. Isso significa que nada do espaço ainda foi alocado.

37.5.2 Configurando o armazenamento como um único namespace PMEM com DAX

Para o primeiro exemplo, configuraremos nossos três NVDIMMs em um único namespace PMEM com Acesso Direto (DAX).

A primeira etapa é criar um novo namespace.

# ndctl create-namespace --type=pmem --mode=fsdax --map=memory
{
 "dev":"namespace3.0",
 "mode":"memory",
 "size":199764213760,
 "uuid":"dc8ebb84-c564-4248-9e8d-e18543c39b69",
 "blockdev":"pmem3"
}

Esse procedimento cria um dispositivo de blocos /dev/pmem3, que suporta DAX. O 3 no nome do dispositivo é herdado do número da região pai, neste caso, region3.

A opção --map=memory separa parte do espaço do armazenamento PMEM nos NVDIMMs para que ele possa ser usado para alocar as estruturas de dados internas do kernel chamadas struct pages. Isso permite que o novo namespace PMEM seja usado com recursos como O_DIRECT I/O e RDMA.

A reserva de parte da memória persistente para estruturas de dados do kernel é o que causa uma redução na capacidade do namespace PMEM em relação à região PMEM pai.

Na sequência, verificamos se o novo dispositivo de blocos está disponível para o sistema operacional:

# fdisk -l /dev/pmem3
Disk /dev/pmem3: 186 GiB, 199764213760 bytes, 390164480 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes

Antes que possa ser usada, como qualquer outra unidade, ela deverá ser formatado. Neste exemplo, nós a formatamos com XFS:

# mkfs.xfs /dev/pmem3
meta-data=/dev/pmem3      isize=256    agcount=4, agsize=12192640 blks
         =                sectsz=4096  attr=2, projid32bit=1
         =                crc=0        finobt=0, sparse=0
data     =                bsize=4096   blocks=48770560, imaxpct=25
         =                sunit=0      swidth=0 blks
naming   =version 2       bsize=4096   ascii-ci=0 ftype=1
log      =internal log    bsize=4096   blocks=23813, version=2
         =                sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none            extsz=4096   blocks=0, rtextents=0

Em seguida, podemos montar a nova unidade em um diretório:

# mount -o dax /dev/pmem3 /mnt/pmem3

Agora, podemos verificar que temos um dispositivo compatível com DAX:

# mount | grep dax
/dev/pmem3 on /mnt/pmem3 type xfs (rw,relatime,attr2,dax,inode64,noquota)

O resultado é que agora contamos com um namespace PMEM formatado com o sistema de arquivos XFS e montado com DAX.

Qualquer chamada mmap() para arquivos nesse sistema de arquivos retornará endereços virtuais que são mapeados diretamente para a memória persistente em nossos NVDIMMs, ignorando o cache de página.

Qualquer chamada fsync ou msync nos arquivos nesse sistema de arquivos ainda garantirá que os dados modificados sejam totalmente gravados nos NVDIMMs. Essas chamadas descarregam as linhas de cache do processador associadas a qualquer página que tenha sido modificada no espaço do usuário por meio de mapeamentos mmap.

37.5.2.1 Removendo um namespace

Antes de criar qualquer outro tipo de volume que use o mesmo armazenamento, devemos desmontar e, em seguida, remover esse volume PMEM.

Em primeiro lugar, desmonte-o:

# umount /mnt/pmem3

Em seguida, desabilite o namespace:

# ndctl disable-namespace namespace3.0
disabled 1 namespace

Por último, apague-o:

# ndctl destroy-namespace namespace3.0
destroyed 1 namespace

37.5.3 Criando um namespace PMEM com BTT

A BTT oferece atomicidade de gravação de setores, o que faz dela uma boa opção quando você precisa de proteção de dados para diários do Ext4 e XFS. Em caso de queda de energia, os diários estão protegidos e podem ser recuperados. Os exemplos a seguir mostram como criar um namespace PMEM com BTT no modo de setor e como colocar o diário do sistema de arquivos nesse namespace.

# ndctl create-namespace --type=pmem --mode=sector
{
 "dev":"namespace3.0",
 "mode":"sector",
 "uuid":"51ab652d-7f20-44ea-b51d-5670454f8b9b",
 "sector_size":4096,
 "blockdev":"pmem3s"
}

Em seguida, verifique se o novo dispositivo está presente:

# fdisk -l /dev/pmem3s
Disk /dev/pmem3s: 188.8 GiB, 202738135040 bytes, 49496615 sectors
Units: sectors of 1 * 4096 = 4096 bytes
Sector size (logical/physical): 4096 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes

Como o namespace PMEM compatível com DAX que configuramos anteriormente, esse namespace PMEM compatível com BTT consome todo o armazenamento disponível nos NVDIMMs.

Nota
Nota

O s à direita do nome do dispositivo (/dev/pmem3s) indica o sector e pode ser usado para diferenciar facilmente os namespaces configurados para usar a BTT.

É possível formatar e montar o volume como no exemplo anterior.

O namespace PMEM mostrado aqui não pode usar DAX. Em vez disso, ele usa o BTT para fornecer atomicidade de gravação do setor. Em cada gravação de setor efetuada por meio do driver de bloco PMEM, o BTT alocará um novo setor para receber os novos dados. O BTT atualizará atomicamente suas estruturas de mapeamento internas depois que os novos dados forem totalmente gravados para que os dados recém-gravados ainda fiquem disponíveis aos aplicativos. Se acabar a força a qualquer momento durante esse processo, a gravação será perdida, e o aplicativo terá acesso a seus dados antigos, ainda intactos. Isso impede a condição conhecida como setores interrompidos.

Esse namespace PMEM habilitado para BTT pode ser formatado e usado com um sistema de arquivos como qualquer outro dispositivo de blocos padrão. Ele não pode ser usado com DAX. No entanto, os mapeamentos mmap para os arquivos nesse dispositivo de blocos usarão o cache de página.

37.5.4 Colocando o diário do sistema de arquivos na PMEM/BTT

Quando você coloca o diário do sistema de arquivos em um dispositivo separado, ele deve usar o mesmo tamanho de bloco que o sistema de arquivos. O tamanho mais provável é 4096, e você pode saber o tamanho do bloco com este comando:

# blockdev --getbsz /dev/sda3

O exemplo a seguir cria um novo diário do Ext4 em um dispositivo NVDIMM separado, cria o sistema de arquivos em um dispositivo SATA e, em seguida, anexa o novo sistema de arquivos ao diário:

# mke2fs -b 4096 -O journal_dev /dev/pmem3s
# mkfs.ext4 -J device=/dev/pmem3s /dev/sda3

O exemplo a seguir cria um novo sistema de arquivos XFS em uma unidade SATA e cria o diário em um dispositivo NVDIMM separado:

# mkfs.xfs -l logdev=/dev/pmem3s  /dev/sda3

Consulte man 8 mkfs.ext4 e man 8 mkfs.ext4 para obter informações detalhadas sobre as opções.

37.6 Mais informações

Mais informações sobre este tópico estão disponíveis na lista a seguir:

  • Persistent Memory Wiki

    Contém instruções sobre como configurar os sistemas NVDIMM, informações sobre testes e links para as especificações relacionadas à habilitação do NVDIMM. Este site é desenvolvido à medida que o suporte a NVDIMM no Linux é desenvolvido.

  • Persistent Memory Programming

    Informações sobre como configurar, usar e programar sistemas com memória não volátil no Linux e em outros sistemas operacionais. Aborda a Biblioteca NVM (NVML, NVM Library), que fornece APIs úteis para programação com memória persistente no espaço do usuário.

  • LIBNVDIMM: Non-Volatile Devices

    Destinado a desenvolvedores de kernel, ele faz parte do diretório Documentação na árvore de kernel atual do Linux. Ele explica sobre os diferentes módulos do kernel envolvidos na preparação do NVDIMM, apresenta alguns detalhes técnicos da implementação do kernel e aborda a interface do sysfs com o kernel que é usada pela ferramenta ndctl.

  • GitHub: pmem/ndctl

    Biblioteca de utilitários para gerenciar o subsistema libnvdimm no kernel do Linux. Inclui também as bibliotecas de espaço do usuário, além de testes de unidade e documentação.