Namespaces NVMe: oportunidades e armadilhas



Tenho certeza que muitos já ouviram falar de NVM Express , ou apenas NVMe . Inicialmente, esses eram apenas drives rápidos para mim. Então percebi que essa é a interface para conectar essas unidades. Então ele começou a entender o NVMe como um protocolo para transferência de dados pelo barramento PCIe. E não apenas um protocolo, mas um protocolo projetado especificamente para drives de estado sólido!



Aos poucos, fui percebendo que essa é uma especificação completa . E lá vamos nós ... Quantos recursos interessantes de uso, ao que parece, existem no NVMe. Quantas coisas foram inventadas ... Foi até um pouco ofensivo que tal camada de informação tenha passado por mim.



Então, o que exatamente é NVMe? Vamos olhar mais de perto.



Tudo começou com a interface SATA . Na verdade, antes dele havia muitas outras interfaces - SCSI, UltraSCSI, ATA, PATA e outras, mas essas são coisas de tempos idos. Neste artigo, consideraremos apenas as interfaces atualmente relevantes.



A velocidade de transferência de dados via interface SATA chega a 560 MB / s, o que é mais do que suficiente para discos HDD, cujo desempenho varia de 90 a 235 MB / s (existem alguns protótipos, cuja velocidade chega a 480 MB / s ) Mas isso não é suficiente para drives SSD, já agora seu desempenho atinge de 3.000 a 3.500 MB / s. A interface SAS também não funcionará, sua velocidade máxima é de apenas 1200 MB / s.



Para aproveitar todo o potencial das unidades de estado sólido, grandes mentes decidiram usar a interface PCIe . Agora, ele permite que você transfira dados em velocidades de 8 a 32 GB / s. Para unificar a conexão de SSDs a interfaces PCIe, a especificação NVMe foi desenvolvida. Da mesma forma que a especificação para conectar drives flash USB foi criada em devido tempo.



Não desmontaremos completamente o NVMe. Neste artigo, quero compartilhar com vocês um recurso que me interessou muito - Namespaces NVMe ou Namespaces .



Esperançosamente, alguns leitores estão interessados ​​em explorar esta tecnologia. Comentários de usuários experientes serão bem-vindos. E se você, como eu, está começando a entender o assunto, recomendo que leia a série de artigos sobre a história do SSD. Certa vez, ela me ajudou a socar e separar um monte de lixo na minha cabeça.



Mais perto de NVMe



NVMe no Linux



Vou começar de longe. Para estudar e pesquisar informações sobre namespaces, fui questionado: "Por que os discos NVMe no Linux são chamados dessa forma?"



Todos estão acostumados a rotular discos no Linux como dispositivos de bloco. Eles são descritores de arquivo que fornecem uma interface para interagir com dispositivos físicos ou virtuais. E esses dispositivos não têm um nome aleatório, mas bastante restrito, que contém algumas informações. Vejamos a seguinte saída do devfs :



root@thinkpad-e14:~$ ls -l /dev/ | grep -E "nvme"
crw-------  1 root    root    241,   0  25 22:04 nvme0
brw-rw----  1 root    disk    259,   0  25 22:04 nvme0n1
brw-rw----  1 root    disk    259,   1  25 22:04 nvme0n1p1
brw-rw----  1 root    disk    259,   2  25 22:04 nvme0n1p2
brw-rw----  1 root    disk    259,   3  25 22:04 nvme0n1p3
      
      





Todos os dispositivos NVMe conectados à máquina de produção estão listados aqui. Considere o dispositivo de bloco / dev / nvme0n1p1 . A parte nvme , estranhamente, é usada para dispositivos NVMe. O número a seguir indica o número de série do controlador de disco , que é responsável por todas as operações realizadas com a unidade. O p1 final indica o número da partição no disco. Finalmente, a parte que merece nossa atenção é n1. Este é o número do espaço.



Para simplificar, você também pode fazer uma analogia com SSDs comuns:



/ dev / sda - análogo de / dev / nvme0n1

/ dev / sda1 - análogo de / dev / nvme0n1p1



Preste atenção ao dispositivo / dev / nvme0. Este é um controlador NVMe. É um dispositivo de caráter. Assim, podemos nos referir a ele enviando certos comandos, que usaremos mais adiante.


Namespace vs partição



Você pode estar se perguntando: como o namespace é diferente da partição? Vamos abandonar todos os recursos e benefícios do Namespace NVMe. A partição é uma partição de disco no nível do host . O namespace é uma seção no nível do controlador . Ou seja, o Namespace é uma espécie de espaço lógico com o qual o host funciona como um dispositivo de bloco.



Outro nível de particionamento agrega flexibilidade à organização do sistema de armazenamento, o que permite a utilização de diversas tecnologias com o objetivo de aumentar a confiabilidade, o desempenho e a segurança dos dados. Veremos eles mais tarde.



Parâmetros do controlador NVMe



Todas as operações de dados são gerenciadas por um controlador NVMe especial. Além disso, em sua memória, ele armazena metadados sobre si mesmo e a estrutura interna de informações: número de série, modelo, todos os tipos de configurações de disco, espaços atribuídos a ele, formato de dados e assim por diante.

Proponho examiná-los ao microscópio. Para fazer isso, enviei um comando especial ao controlador, em resposta ao qual ele retornou os metadados. Explicarei como fazer isso mais tarde, mas por enquanto dê uma olhada neles. Como há muitos dados, não os inseri inteiramente, mas você deve saber que os parâmetros dos quais falarei mais tarde realmente existem :



{
  "vid" : 5197,
  "ssvid" : 5197,
  "sn" : "00000000000000",
  "mn" : "00000000000000000000000000",
  "fr" : "7L1QFXV7",
  "rab" : 2,
  "ieee" : 9528,
  "cmic" : 0,
  "mdts" : 9,
  "cntlid" : 5,
  "ver" : 66304,
  "rtd3r" : 100000,
  "rtd3e" : 8000000,
  "oaes" : 512,
  "ctratt" : 0,
  "rrls" : 0,
  "crdt1" : 0,
  "crdt2" : 0,
  "crdt3" : 0,
  "oacs" : 23,
  "tnvmcap" : 256060514304,
  "unvmcap" : 0,
  ...
}
      
      





Os metadados são armazenados no controlador como uma sequência de bytes em ordem de alto a baixo, então, além disso, irei aderir ao seguinte formato de gravação:

[intervalo em bytes (formato Big-Endian)] / nome do parâmetro / descriptografia.



Um exemplo para melhor compreensão. O seguinte registro significa que de 71 a 64 bytes o valor do parâmetro fr é armazenado , que significa revisão do firmware :



[71:64] / fr / revisão do firmware.

[23: 4] / sn / número de série. Contém o número de série do controlador.

[63:24] / mn / número do modelo. Contém o número do modelo ou número da peça.

[71:64] / fr / revisão do firmware.Contém o número de revisão do firmware do controlador.

[257: 256] / oacs / suporte opcional ao comando admin. Indica a presença de comandos e funções de controlador adicionais. É composto por 16 bits, cada um dos quais é responsável por um comando específico. Se o bit for 1, o controlador torna possível:



  • [15:10] - reservado;
  • [9] - obtém o status do LBA;
  • [8] - obtenha acesso ao "Doorbell Buffer Config" ;
  • [7] - para gerenciar a virtualização ("Gerenciamento de virtualização") ;
  • [6] - use os comandos NVMe-Mi Recieve e NVMe-Mi Send ("Interface de gerenciamento NVMe" );
  • [5] - usar diretivas ("Diretivas") ;
  • [4] — («Self-Test Commands»);
  • [3] — («Namespace Management»);
  • [2] — ( «Firmware Commit» «Firmware Download»);
  • [1] — («NVM Format»);
  • [0] — («Security Send», «Security Receive»).


Neste artigo, abordaremos apenas as funções relacionadas a namespaces, a saber, "Gerenciamento de namespaces" e "Formato NVM" . Se você estiver interessado em detalhes sobre outros recursos, pode consultar a especificação NVM Express Revisão 1.4 .



Parâmetros de espaço NVMe



Agora vamos dar uma olhada nos metadados dos espaços NVMe:



{
  "nsze" : 500118192,
  "ncap" : 500118192,
  "nuse" : 233042000,
  "nsfeat" : 0,
  "nlbaf" : 0,
  "flbas" : 0,
  "mc" : 0,
  "dpc" : 0,
  "dps" : 0,
  "nmic" : 0,
  "rescap" : 0,
  ...
  ]
}
      
      





[7: 0] / nsze / tamanho do namespace. Esta é a quantidade máxima de espaço em blocos lógicos. Neste caso - 500118192 blocos de 512 bytes, que, a propósito, é indicado na saída do blockdev :



root@thinkpad-e14:~$ sudo blockdev --getsz /dev/nvme0n1
500118192
      
      





[15: 8] / ncap / capacidade de namespace . Este é o número de blocos lógicos atualmente alocados para o espaço de armazenamento.



[23:17] / nuse / uso de namespace. Este é o número de blocos lógicos atualmente ocupados por dados.



Observe que as opções nsze e ncap são iguais. Qual é o ponto de especificar o volume máximo e o volume que está alocado atualmente? Isso significa que, no momento, pode haver menos alocação do que disponível? Sim!



O fato é que os namespaces suportam a tecnologia Thin Provisioning . ... Isso significa que apenas uma fração do volume especificado é alocada para o espaço. A outra parte permanecerá no pool compartilhado e será alocada para este ou outros espaços sob demanda: quando o volume alocado estiver cheio ou quando um limite crítico for atingido. Em geral, essa tecnologia permite um uso mais eficiente dos recursos de armazenamento. Mais detalhes e mais clareza com essa tecnologia podem ser encontrados neste artigo .



Na nossa situação nsze e ncap iguais, porque o espaço foi criado sem o apoio da distribuição fina. Esse espaço no disco ficará assim:





NCAP e nsize irá apontar para uma一 quantidade total de espaço . No caso de usar distribuição fina no disco, o espaço ficará assim:





Aqui nsze indica o volume máximo, nca p - o alocado e nuse em ambos os casos mostra apenas o que está ocupado. Quando o valor de nuse atinge ncap , o ncap aumenta, mas não mais do que nsze .



É importante notar que, para oferecer suporte a essa tecnologia, é necessária a configuração apropriada do namespace, bem como o suporte para distribuição thin do lado do controlador.



[24:24] / nsfeat / recursos de namespace.Este parâmetro é especialmente interessante. Indica a presença de recursos adicionais do espaço. Ele consiste em 8 bits (eles também estão listados no Big Endian), cada um dos quais é responsável por uma função específica. Se o valor do bit for 1, a função está ativa, 0 - não:



  • [7: 5] - reservado;
  • [4: 4] - suporte para campos adicionais para otimizar I / O ;
  • [3: 3] - desativa a reutilização do campo NGUID ;
  • [2: 2] - suporte para blocos excluídos e não escritos ("Atributos de contexto") ;
  • [1: 1] - suporte para campos adicionais para gravação atômica ("Operações Atômicas") ;
  • [0: 0] - suporte para distribuição fina .


[26:26] / flbas / tamanho lba formatado . Este parâmetro aponta para uma estrutura LBA. Também consiste em 8 bits:



  • [7: 5] - reservado;
  • [4: 4] - se definido como 1: indica que os metadados serão armazenados no final do bloco; com um valor de 0: os metadados são transferidos em um buffer separado ;
  • [3: 0] - permite que você selecione um dos 16 formatos de LBA possíveis.




[29:29] / dps / configurações de tipo de proteção de dados ponta a ponta . Indica o tipo de proteção de dados ponta a ponta. Consiste em 8 bits:



  • [7: 4 ] - reservado;
  • [3: 3] - indica o tipo de transferência de metadados;
  • [2: 0] - indica a presença de proteção de dados e seu tipo.


[30:30] / nmic / namespace multi-path e recursos de compartilhamento de namespace . Este campo indica suporte para recursos relacionados ao multiacesso a namespaces:



  • [7: 1] - reservado;
  • [0: 0] - um valor de 1 indica que este espaço é público (namespace público) e pode se comunicar com vários controladores , e um valor de 0 indica que o espaço é privado (namespace privado) e está vinculado a apenas um .


Isso conclui sua breve visão geral dos parâmetros. Seu número é enorme, o que permite configurar namespaces de maneira muito precisa para várias tarefas, que consideraremos no final do artigo. Uma descrição detalhada de cada parâmetro pode ser encontrada na especificação NVM Express Revisão 1.4 .



Espaços públicos e privados



O artigo já mencionou termos como espaços públicos e espaços privados . Mas não esclareci o seu significado, por isso considero necessário dedicar um pouco de tempo a eles.



Uma das etapas na criação de um espaço é atribuí-lo a um controlador NVMe. O acesso ao espaço será feito através do controlador ao qual está atribuído. Mas o espaço pode ser atribuído não apenas a um controlador - privado, mas também a vários controladores - público.



Se um espaço privado pode ser chamado de comum, já que nada de interessante pode ser feito com ele, então um espaço público permite que você use uma oportunidade como um namespace multi-caminho...



Interoperabilidade com NVMe



Vamos direto ao assunto da interação com dispositivos NVMe: como enviar vários comandos para o controlador, criar namespaces, formatá-los, etc. Para isso, existe um utilitário no mundo Linux - nvme-cli. Com sua ajuda, você pode realizar essas operações.



lista nvme



Para listar dispositivos NVMe, não é necessário acessar devfs desta forma:



root@thinkpad-e14:~$ ls /dev/ | grep "nvme"
nvme0
nvme0n1
nvme0n1p1
nvme0n1p2
nvme0n1p3
      
      





Ou use o lspci para descobrir o que está conectado à máquina:



root@thinkpad-e14:~$ lspci | grep -E "NVMe|Non-Volatile"
07:00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd Device a809
      
      





Basta usar o comando nvme list :



root@thinkpad-e14:~$ nvme list -o json
{
  "Devices" : [
    {
      "NameSpace" : 1,
      "DevicePath" : "/dev/nvme0n1",
      "Firmware" : "9L1QFXV7",
      "Index" : 0,
      "ModelNumber" : "SAMSUNG MZALQ256HAJD-000L1",
      "ProductName" : "Non-Volatile memory controller: Samsung Electronics Co Ltd Device 0xa809",
      "SerialNumber" : "00000000000000",
      "UsedBytes" : 38470483968,
      "MaximumLBA" : 500118192,
      "PhysicalSize" : 256060514304,
      "SectorSize" : 512
    }
  ]
}
      
      





Produzi as informações no formato JSON como exemplo . Como você pode ver, não apenas uma lista de dispositivos é exibida aqui, mas também várias informações sobre eles. Acho que alguns dos atributos (por exemplo, DevicePath ou ModelNumbe r) não precisam de comentários, então presto atenção apenas a alguns:



  • Índice - número do controlador;
  • UsedBytes A quantidade de espaço usado em bytes.
  • PhysicalSize - a quantidade máxima de espaço em bytes;
  • SectorSize - formato de LBA ou bloco lógico - o menor bloco de dados endereçável;
  • MaximumLBA é o número máximo de blocos lógicos.


nvme id-ctrl, nvme id-ns



Anteriormente neste artigo, para obter metadados sobre um dispositivo, enviei o comando Identify para o controlador . Para isso, usei o comando nvme id-ctrl para identificar o controlador:



root@thinkpad-e14:~$ nvme id-ctrl /dev/nvme0
      
      





E nvme id-ns para identificar o espaço:

root@thinkpad-e14:~$ nvme id-ns /dev/nvme0n1
      
      





Observe que você precisa especificar um dispositivo - um controlador ou namespace.



nvme create-ns, nvme delete-ns



Os namespaces são criados em vários estágios. Primeiro você precisa moldá-lo. Para fazer isso, use o comando nvme create-ns :



root@thinkpad-e14:~$ nvme create-ns /dev/nvme0 --nsze 1875385008 --ncap 1875385008 --flbas 0 --nmic 1 --dps 0
create-ns: Success, created nsid:1
      
      





Você já está familiarizado com os argumentos dados a este comando. Nós os examinamos na seção "Configurações do espaço NVMe".



Para excluir um espaço, use o comando nvme delete-ns :



root@thinkpad-e14:~$ nvme delete-ns /dev/nvme0n1          
delete-ns: Success, deleted nsid:1
      
      





nvme attach-ns, nvme detach-ns



O segundo estágio da criação de espaços NVMe é vincular o espaço gerado ao controlador. Para fazer isso, use o comando nvme attach-ns :



root@thinkpad-e14:~$ nvme attach-ns /dev/nvme0 --namespace-id 1 --controllers 1
attach-ns: Success, nsid:1
      
      





Com este comando, vinculamos o espaço com o identificador 1 ao controlador / dev / nvme0 . Observe também o argumento --controllers . Isso lista os IDs dos controladores NVMe para os quais o espaço pode ser mapeado. Este argumento é opcional e é usado ao criar espaços públicos.



Por alguma razão, a numeração dos controladores começa em 1, ou seja, o controlador / dev / nvme0 possui um identificador de 1, que é especificado no argumento --controllers. Esperamos que isso o ajude a evitar a perda de tempo pesquisando o seguinte erro:



root@thinkpad-e14:~$ nvme attach-ns /dev/nvme0 --namespace-id 1 --controllers 0                            
NVMe Status:CONTROLLER_LIST_INVALID: The controller list provided is invalid(211c)
      
      





Para desatar o espaço, use o comando nvme detach-ns :



root@thinkpad-e14:~$ nvme detach-ns /dev/nvme0n1 --namespace-id 1 --controllers 1
detach-ns: Success, nsid:1
      
      





O espaço então desaparece da lista de dispositivos de bloqueio e se torna inutilizável. Você também precisa especificar apenas os controladores dos quais deseja desacoplar o espaço no argumento --controllers.



nvme reset



Depois que um espaço é vinculado a um controlador, ele geralmente pode ser usado para trabalhar. No entanto, acontece que o controlador não consegue ver o espaço. Nesse caso, ele deve ser reiniciado - use o comando nvme reset .



formato nvme



Se for necessário alterar o formato do LBA para um espaço, o comando nvme format vem para o resgate :



root@thinkpad-e14:~$ nvme format /dev/nvme0n1 --lbaf 0
Success formatting namespace:1
      
      





O argumento --lbaf indica o formato LBA.



No entanto, este comando também pode ser usado para apagar dados com segurança em uma unidade NVMe:



root@thinkpad-e14:~$ nvme format /dev/nvme0n1 --ses 1 -r
Success formatting namespace:1
      
      





O argumento --ses indica o nível de argamassa:



  • 1 - excluir todos os dados;
  • 2 - excluir dados criptografados.


O argumento -r indica que o controlador reiniciará após uma argamassa segura.



Inscrição



Existem muitos usos possíveis para os espaços. Eles são usados ​​principalmente para aumentar o desempenho, redundância e são usados ​​em sistemas de armazenamento, mas existem casos de uso mais mundanos.



Área Sobressalente



Vamos começar com uma prática de uso bastante comum. A área sobressalente, ou área de reserva, foi inventada antes mesmo do NVMe. Este é um espaço especial no SSD que é usado pelo próprio controlador para operações internas e não está disponível para o host.



Ao alterar o tamanho dos espaços, também podemos alterar o tamanho da área de fallback. O fato é que todo o volume do disco é igual à soma dos volumes de todos os espaços e o volume da área sobressalente:





Assim, se reduzirmos o volume total dos espaços, o volume restante irá a favor da área livre.



Se você quiser saber mais sobre a área de backup, consulte este artigo .



Criptografia e isolamento





As unidades NVMe suportam OPAL SEDs . Além disso, diferentes chaves de criptografia são usadas para cada namespace.



O controlador também oferece proteção contra gravação. Existem três níveis:



  • somente leitura até a próxima reinicialização;
  • somente leitura até a próxima reinicialização após desativar a função de proteção contra gravação;
  • somente leitura em todo o trabalho.




É freqüentemente usado em PCs fixos e móveis. Por exemplo, um bootloader pode ser colocado em um espaço somente leitura para evitar danificá-lo. Outros dados importantes podem ser protegidos da mesma maneira.



Uso múltiplo



Conforme mencionado anteriormente, os espaços são partições no nível do controlador que são visíveis para o host final como um dispositivo separado. É possível dividir um grande drive NVMe em vários espaços privados, cada um dos quais é então alocado para diferentes hosts? Pode! E usando o protocolo de rede NVMe-oF (NVMe Over Fabrics) , esses espaços podem ser alocados não apenas para hosts virtuais, mas também para físicos.



Com esse uso da unidade, o esquema de particionamento ficará assim:





O controlador NVMe garantirá que os espaços sejam isolados uns dos outros: os dados serão armazenados em áreas separadas do drive, cada host terá sua própria fila de E / S. No entanto, a área livre , ou áreas livres , ainda serão compartilhadas.



Namespace multicaminho e compartilhamento de namespace



Compartilhamento de namespace, ou namespaces públicos, significa que um ou mais hosts podem compartilhar um espaço por meio de dois ou mais controladores.





Para que serve? A figura mostra um diagrama do uso dos espaços públicos. Sim, interessante: podemos acessar o espaço NS B através do controlador NVMe 1 e controlador NVMe 2. Mas não vejo nenhuma utilidade nisso ... até que o diagrama fique assim:





Aqui, vemos que os controladores estão em hosts completamente diferentes e temos vários caminhos independentes para os dados: por meio dos controladores de host Host A (controladores azuis) e Host B (controladores roxos). Agora, isso pode ser usado para redundância ou para aumentar o desempenho: se o caminho azul estiver muito carregado, seguiremos pelo caminho roxo.



Essa abordagem permite que você organize sistemas de armazenamento definidos por software flexíveis de alto desempenho e altamente confiáveis ​​de plataformas de servidor convencionais usando NVMe-oF.



Resultado



Os namespaces NVMe não são apenas um mecanismo valioso, não apenas uma partição lógica de um disco. Esta é uma tecnologia muito interessante e importante que permite construir soluções de infraestrutura convenientes para armazenamento de dados. Oportunidades de redundância, criptografia e aumento da vida útil do disco permitem manter a operação estável de serviços altamente carregados.



Neste artigo, não cobrimos todos os aspectos e sutilezas do uso de namespaces. Ao contrário, acabou por ser uma crítica ou um conhecido. No entanto, espero que isso ajude você a começar com um estudo mais profundo da tecnologia, se desejar.



Posfácio



Ao escrever este artigo, me deparei com uma série de problemas popabolyu , o que me impediu de terminar o trabalho. Tenha cuidado ao escolher unidades para testar os vários recursos do NVMe. Não foi a primeira vez que consegui resolver os problemas e encontrar um disco que atendesse minimamente às minhas necessidades. E os fabricantes de discos relutam em compartilhar essas informações, e alguns até são enganosos, então tivemos que agir aleatoriamente. Especificamente, encontrei problemas como este:



  • As unidades Samsung 970 EVO / 970 EVO Plus com firmware 2b2qexe7 / 2b2qexm7 não implementam os comandos de redefinição e formatação;
  • As unidades Samsung 970 EVO / 970 EVO Plus com firmware 2b2qexe7 / 2b2qexm7 não implementam gerenciamento de espaço usando os comandos create-ns, delete-ns, detach-ns e atach-ns;
  • As unidades Samsung PM991 com firmware 9L1QFXV7 têm um bug devido ao qual reiniciar o controlador usando o comando reset resulta em um erro;
  • As unidades Samsung PM991 com firmware 9L1QFXV7 têm um bug devido ao qual a formatação do espaço usando o comando format resulta em um erro;
  • As unidades Samsung PM991 com firmware 9L1QFXV7 não implementam gerenciamento de espaço usando os comandos create-ns, delete-ns, detach-ns e atach-ns.


Tenho certeza de que os discos do segmento corporativo estão livres desses problemas, mas nem todos podem comprar tais peças de hardware, portanto, estude os discos e manuais para eles em detalhes no momento da compra. E se houver a oportunidade de examinar os discos antes de comprar e ver os parâmetros do controlador NVMe, certifique-se de usá-lo.



Fontes úteis



  1. SSD: dispositivo, componentes e princípios de operação
  2. Um tour rápido do NVM Express
  3. Especificação NVMe 1.4
  4. Namespaces NVMe
  5. Base NVM Express — Part One
  6. NVMe Command Line Interface (NVMe-CLI)
  7. NVMe Over Fabrics





All Articles