Espacios de nombres NVMe: oportunidades y dificultades



Estoy seguro de que muchos han oído hablar de NVM Express , o simplemente de NVMe . Inicialmente, estos eran solo discos rápidos para mí. Luego me di cuenta de que esta es la interfaz para conectar estas unidades. Luego comenzó a entender NVMe como un protocolo para transferir datos a través del bus PCIe. ¡Y no solo un protocolo, sino un protocolo diseñado específicamente para unidades de estado sólido!



Poco a poco me di cuenta de que esta es toda una especificación . Y vamos ... Cuántas características interesantes de uso, resulta que existen en NVMe. Cuántas cosas se inventaron ... Incluso fue un poco ofensivo que tal capa de información pasara por mí.



Entonces, ¿qué es exactamente NVMe? Miremos más de cerca.



Todo comenzó con la interfaz SATA . De hecho, antes había muchas otras interfaces: SCSI, UltraSCSI, ATA, PATA y otras, pero estas son cosas de tiempos pasados. En este artículo, consideraremos solo las interfaces relevantes actualmente.



La velocidad de transferencia de datos a través de la interfaz SATA alcanza los 560 MB / s, que es más que suficiente para los discos HDD, cuyo rendimiento varía de 90 a 235 MB / s (hay algunos prototipos, cuya velocidad alcanza los 480 MB / s ). Pero esto no es suficiente para las unidades SSD, ya que ahora su rendimiento alcanza de 3000 a 3500 MB / s. La interfaz SAS tampoco funcionará, su velocidad máxima es de solo 1200 MB / s.



Para aprovechar todo el potencial de las unidades de estado sólido, grandes mentes han decidido utilizar la interfaz PCIe . Ahora te permite transferir datos a velocidades de 8 a 32 GB / s. Para unificar la conexión de SSD a interfaces PCIe, se desarrolló la especificación NVMe. De la misma manera que la especificación para la conexión de unidades flash USB se creó a su debido tiempo.



No desmontaremos NVMe por completo. En este artículo, quiero compartir con ustedes una característica que me interesó mucho: los espacios de nombres NVMe o espacios de nombres .



Ojalá haya algunos lectores interesados ​​en explorar esta tecnología. Los comentarios de los usuarios experimentados serán bienvenidos. Y si tú, como yo, apenas estás empezando a entender el tema, te recomiendo que leas la serie de artículos sobre la historia de los SSD. En un momento, ella me ayudó a apisonar y ordenar un montón de basura en mi cabeza.



Más cerca de NVMe



NVMe en Linux



Empezaré desde lejos. Para estudiar y buscar información sobre espacios de nombres, me surgió la pregunta: "¿Por qué los discos NVMe en Linux se llaman así?"



Todo el mundo está acostumbrado a etiquetar discos en Linux como dispositivos de bloque. Son descriptores de archivos que proporcionan una interfaz para interactuar con dispositivos físicos o virtuales. Y tales dispositivos no tienen un nombre aleatorio, sino bastante estricto, que contiene cierta información. Veamos el siguiente resultado de 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 los dispositivos NVMe conectados a la máquina de producción se enumeran aquí. Considere el dispositivo de bloque / dev / nvme0n1p1 . La parte nvme , por extraño que parezca, se utiliza para dispositivos NVMe. El siguiente número indica el número de serie del controlador de disco , que es responsable de todas las operaciones realizadas con la unidad. El p1 final indica el número de partición en el disco. Finalmente, la parte que merece nuestra atención es n1. Este es el número del espacio.



Para simplificar, también puede hacer alguna analogía con SSD ordinarios:



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

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



Preste atención al dispositivo / dev / nvme0. Este es un controlador NVMe. Es un dispositivo de carácter. Así, podemos referirnos a él enviando ciertos comandos, que usaremos más adelante.


Espacio de nombres vs partición



Quizás se esté preguntando: ¿en qué se diferencia el espacio de nombres de la partición? Dejemos de lado todas las características y beneficios del espacio de nombres NVMe. La partición es una partición de disco a nivel de host . El espacio de nombres es una sección a nivel de controlador . Es decir, el espacio de nombres es una especie de espacio lógico con el que el host funciona como un dispositivo de bloque.



Otro nivel de partición agrega flexibilidad a la organización del sistema de almacenamiento, lo que permite el uso de diversas tecnologías destinadas a aumentar la confiabilidad, el rendimiento y la seguridad de los datos. Los veremos más tarde.



Parámetros del controlador NVMe



Todas las operaciones de datos son manejadas por un controlador NVMe especial. Además, en su memoria almacena metadatos sobre sí mismo y la estructura interna de la información: número de serie, modelo, todo tipo de configuraciones de disco, espacios asignados, formato de datos, etc.

Propongo examinarlos bajo un microscopio. Para hacer esto, envié un comando especial al controlador, en respuesta al cual devolvió los metadatos. Explicaré cómo hacer esto más tarde, pero por ahora échales un vistazo. Como hay muchos datos, no los inserté por completo, pero debes saber que los parámetros de los que hablaré más adelante en realidad existen :



{
  "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,
  ...
}
      
      





Los metadatos se almacenan en el controlador como una secuencia de bytes en orden de mayor a menor, por lo que además seguiré el siguiente formato de grabación:

[intervalo en bytes (formato Big-Endian)] / nombre del parámetro / descifrado.



Un ejemplo para una mejor comprensión. El siguiente registro significa que de 71 a 64 bytes se almacena el valor del parámetro fr , que significa revisión de firmware :



[71:64] / fr / revisión de firmware.

[23: 4] / sn / número de serie. Contiene el número de serie del controlador.

[63:24] / mn / número de modelo. Contiene el número de modelo o número de pieza.

[71:64] / fr / revisión de firmware.Contiene el número de revisión del firmware del controlador.

[257: 256] / oacs / soporte de comando de administrador opcional. Indica la presencia de comandos y funciones de controlador adicionales. Consta de 16 bits, cada uno de los cuales es responsable de un comando específico. Si el bit es 1, entonces el controlador lo hace posible:



  • [15:10] - reservado;
  • [9] - obtener el estado de LBA;
  • [8] - obtenga acceso a la "Configuración del búfer del timbre" ;
  • [7] - para gestionar la virtualización ("Gestión de la virtualización") ;
  • [6] - use los comandos NVMe-Mi Recieve y NVMe-Mi Send ("Interfaz de administración NVMe" );
  • [5] - directivas de uso ("Directivas") ;
  • [4] — («Self-Test Commands»);
  • [3] — («Namespace Management»);
  • [2] — ( «Firmware Commit» «Firmware Download»);
  • [1] — («NVM Format»);
  • [0] — («Security Send», «Security Receive»).


En este artículo, solo tocaremos aquellas funciones que están relacionadas con los espacios de nombres, a saber, "Gestión de espacios de nombres" y "Formato NVM" . Si está interesado en obtener detalles sobre otras funciones, puede consultar la especificación NVM Express Revision 1.4 .



Parámetros de espacio NVMe



Ahora veamos los metadatos de los espacios 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 / tamaño del espacio de nombres. Ésta es la cantidad máxima de espacio en bloques lógicos. En este caso, 500118192 bloques de 512 bytes, que, por cierto, se indica en la salida blockdev :



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





[15: 8] / ncap / capacidad de espacio de nombres . Este es el número de bloques lógicos asignados actualmente al espacio de almacenamiento.



[23:17] / nuse / uso del espacio de nombres. Este es el número de bloques lógicos ocupados actualmente por datos.



Tenga en cuenta que las opciones nsze y ncap son iguales. ¿Cuál es el punto de especificar el volumen máximo y el volumen que se asigna actualmente? ¿Significa esto que en este momento puede haber menos asignados que disponibles? ¡Sí!



El hecho es que los espacios de nombres admiten la tecnología Thin Provisioning . ... Esto significa que solo una fracción del volumen especificado se asigna al espacio. La otra parte permanecerá en el pool compartido y se asignará a este u otros espacios bajo demanda: cuando el volumen asignado esté lleno o cuando se alcance un umbral crítico. En general, esta tecnología permite un uso más eficiente de los recursos de almacenamiento. En este artículo se pueden encontrar más detalles y más claramente con esta tecnología .



En nuestra situación, nsze y ncap son iguales, porque el espacio se creó sin el apoyo de la distribución fina. Dicho espacio en el disco se verá así:





ncap y nsize apuntarán a una 一 cantidad total de espacio . En el caso de utilizar una distribución delgada en el disco, el espacio se verá así:





Aquí nsze indica el volumen máximo, nca p - el asignado, y nuse en ambos casos muestra solo lo que está ocupado. Cuando el valor de nuse alcanza ncap , el ncap aumenta, pero no más que nsze .



Vale la pena señalar que para admitir esta tecnología, se requiere una configuración adecuada del espacio de nombres, así como compatibilidad con la distribución delgada desde el lado del controlador.



[24:24] / nsfeat / características del espacio de nombres.Este parámetro es especialmente interesante. Indica la presencia de características adicionales del espacio. Consta de 8 bits (también se enumeran en Big Endian), cada uno de los cuales es responsable de una función específica. Si el valor del bit es 1, entonces la función está activa, 0 - no:



  • [7: 5] - reservado;
  • [4: 4] - soporte para campos adicionales para optimizar E / S ;
  • [3: 3]: desactiva la reutilización del campo NGUID ;
  • [2: 2] - soporte para bloques borrados y no escritos ("Atributos de contexto") ;
  • [1: 1] - soporte para campos adicionales para registro atómico ("Operaciones atómicas") ;
  • [0: 0] - soporte para distribución delgada .


[26:26] / flbas / formato lba tamaño . Este parámetro apunta a una estructura LBA. También consta de 8 bits:



  • [7: 5] - reservado;
  • [4: 4] - si se establece en 1: indica que los metadatos se almacenarán al final del bloque; con un valor de 0: los metadatos se transfieren en un búfer separado ;
  • [3: 0] : le permite seleccionar uno de los 16 formatos LBA posibles.




[29:29] / dps / configuración de tipo de protección de datos de un extremo a otro . Indica el tipo de protección de datos de un extremo a otro. Consta de 8 bits:



  • [7: 4 ] - reservado;
  • [3: 3] : indica el tipo de transferencia de metadatos;
  • [2: 0] : indica la presencia de protección de datos y su tipo.


[30:30] / nmic / namespace multi-path y capacidades de intercambio de espacios de nombres . Este campo indica compatibilidad con funciones relacionadas con el acceso múltiple a espacios de nombres:



  • [7: 1] - reservado;
  • [0: 0] : un valor de 1 indica que este espacio es público (espacio de nombres público) y puede comunicarse con varios controladores , y un valor de 0 indica que el espacio es privado (espacio de nombres privado) y está vinculado solo a uno .


Con esto concluye su breve descripción general de los parámetros. Su número es enorme, lo que le permite configurar con mucha precisión los espacios de nombres para varias tareas, que consideraremos al final del artículo. Se puede encontrar una descripción detallada de cada parámetro en la especificación NVM Express Revision 1.4 .



Espacios públicos y privados



El artículo ya ha mencionado términos como espacios públicos y espacios privados . Pero no aclaré su significado, por lo que considero necesario dedicarles un poco de tiempo.



Uno de los pasos para crear un espacio es asignarlo a un controlador NVMe. El acceso al espacio se realizará a través del controlador al que esté asignado. Pero el espacio se puede asignar no solo a un controlador, privado, sino también a varios controladores, públicos.



Si un espacio privado se puede llamar ordinario, ya que no se puede hacer nada interesante con él, entonces un espacio público le permite aprovechar una oportunidad como el espacio de nombres de múltiples rutas...



Interoperabilidad con NVMe



Vayamos al tema de la interacción con dispositivos NVMe: cómo enviar varios comandos al controlador, crear espacios de nombres, formatearlos, etc. Para esto, existe una utilidad en el mundo Linux: nvme-cli. Con su ayuda, puede realizar estas operaciones.



lista nvme



Para enumerar los dispositivos NVMe, no es necesario acceder a devfs de esta manera:



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





O use lspci para averiguar qué está conectado a la 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 con usar el 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
    }
  ]
}
      
      





He mostrado la información en formato JSON como ejemplo . Como puede ver, aquí no solo se muestra una lista de dispositivos, sino también información diversa sobre ellos. Creo que algunos de los atributos (por ejemplo, DevicePath o ModelNumbe r) no necesitan comentarios, por lo que presto atención solo a algunos:



  • Índice - número de controlador;
  • UsedBytes La cantidad de espacio utilizado en bytes.
  • PhysicalSize : la cantidad máxima de espacio en bytes;
  • SectorSize - LBA o formato de bloque lógico - el bloque de datos direccionable más pequeño;
  • MaximumLBA es el número máximo de bloques lógicos.


nvme id-ctrl, nvme id-ns



Anteriormente en el artículo, para obtener metadatos sobre un dispositivo, envié el comando Identificar al controlador . Para esto, utilicé el comando nvme id-ctrl para identificar el controlador:



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





Y nvme id-ns para identificar el espacio:

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





Tenga en cuenta que debe especificar un dispositivo: un controlador o un espacio de nombres.



nvme create-ns, nvme delete-ns



Los espacios de nombres se crean en varias etapas. Primero necesitas darle forma. Para hacer esto, use el 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
      
      





Ya está familiarizado con los argumentos dados a este comando. Los examinamos en la sección "Configuración de espacio NVMe".



Para eliminar un espacio, use el comando nvme delete-ns :



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





nvme attach-ns, nvme detach-ns



La segunda etapa de la creación de espacios NVMe es vincular el espacio generado al controlador. Para hacer esto, use el comando nvme attach-ns :



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





Con este comando, vinculamos el espacio con el identificador 1 al controlador / dev / nvme0 . También observe el argumento --controllers . Aquí se enumeran los ID de los controladores NVMe a los que se puede asignar el espacio. Este argumento es opcional y se utiliza al crear espacios públicos.



Por alguna razón, la numeración de los controladores comienza desde 1, es decir, el controlador / dev / nvme0 tiene un identificador de 1, que se especifica en el argumento --controllers. Con suerte, esto le ayudará a evitar perder el tiempo investigando el siguiente error:



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 el espacio, use el comando nvme detach-ns :



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





Luego, el espacio desaparece de la lista de dispositivos de bloqueo y se vuelve inutilizable. También debe especificar solo los controladores de los que desea desacoplar el espacio en el argumento --controllers.



nvme restablecer



Una vez que un espacio se ha vinculado a un controlador, generalmente se puede usar para trabajar. Sin embargo, sucede que el controlador no puede ver el espacio. En este caso, debe reiniciarse: use el comando nvme reset .



formato nvme



Si es necesario cambiar el formato LBA de un espacio, el comando nvme format viene al rescate :



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





El argumento --lbaf indica el formato LBA.



Sin embargo, este comando también se puede utilizar para borrar datos de forma segura en una unidad NVMe:



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





El argumento --ses indica el nivel de lechada:



  • 1 - eliminar todos los datos;
  • 2 - eliminar datos cifrados.


El argumento -r indica que el controlador se reiniciará después de una lechada segura.



Solicitud



Hay muchos usos posibles para los espacios. Se utilizan principalmente para aumentar el rendimiento, la redundancia y se utilizan en sistemas de almacenamiento, pero hay casos de uso más mundanos.



Área de repuesto



Comencemos con una práctica de uso bastante común. El área de reserva, o área de reserva, se inventó incluso antes de NVMe. Este es un espacio especial en el SSD que es utilizado por el propio controlador para operaciones internas y no está disponible para el host.



Al cambiar el tamaño de los espacios, también podemos cambiar el tamaño del área de respaldo. El hecho es que el volumen total del disco es igual a la suma de los volúmenes de todos los espacios y el volumen del área libre:





En consecuencia, si reducimos el volumen total de espacios, entonces el volumen restante irá a favor del área libre.



Si desea saber más sobre el área de copia de seguridad, puede consultar este artículo .



Cifrado y aislamiento





Las unidades NVMe son compatibles con OPAL SED . Además, se utilizan diferentes claves de cifrado para cada espacio de nombres.



El controlador también proporciona protección contra escritura. Hay tres niveles:



  • de solo lectura hasta el próximo reinicio;
  • de solo lectura hasta el próximo reinicio después de deshabilitar la función de protección contra escritura;
  • de solo lectura durante todo el trabajo.




Se utiliza a menudo en PC fijas y móviles. Por ejemplo, un cargador de arranque se puede colocar en un espacio de solo lectura para evitar dañarlo. Otros datos importantes se pueden proteger de la misma manera.



Uso múltiple



Como se mencionó anteriormente, los espacios son particiones a nivel de controlador que son visibles para el host final como un dispositivo separado. ¿Es posible dividir una unidad NVMe grande en varios espacios privados, cada uno de los cuales se asigna a diferentes hosts? ¡Poder! Y utilizando el protocolo de red NVMe-oF (NVMe Over Fabrics) , estos espacios se pueden asignar no solo a hosts virtuales, sino también a los físicos.



Con este uso de la unidad, el esquema de partición se verá así:





El controlador NVMe se asegurará de que los espacios estén aislados entre sí: los datos se almacenarán en áreas separadas de la unidad, cada host tendrá su propia cola de E / S. Sin embargo, el área libre , o áreas libres , seguirá siendo compartida.



Espacio de nombres Multi-ruta y uso compartido de espacios de nombres



El uso compartido de espacios de nombres, o espacios de nombres públicos, significa que uno o más hosts pueden compartir un espacio a través de dos o más controladores.





¿Para qué sirve? La figura muestra un diagrama del uso de los espacios públicos. Sí, interesante: podemos acceder al espacio NS B a través del NVMe Controller 1 y NVMe Controller 2. Pero no veo ninguna utilidad en esto ... hasta que el diagrama se ve así:





Aquí vemos que los controladores están en hosts completamente diferentes y tenemos varias rutas independientes a los datos: a través de los controladores de host Host A (controladores azules) y Host B (controladores violetas). Ahora, esto se puede usar para redundancia o para aumentar el rendimiento: si la ruta azul está muy cargada, entonces iremos por la púrpura.



Este enfoque le permite organizar sistemas de almacenamiento definidos por software flexibles de alto rendimiento y altamente confiables desde plataformas de servidor convencionales utilizando NVMe-oF.



Salir



Los espacios de nombres NVMe no son solo un mecanismo valioso, no solo una partición lógica de un disco. Esta es una tecnología muy interesante e importante que le permite crear soluciones de infraestructura convenientes para el almacenamiento de datos. Las oportunidades de redundancia, cifrado y aumento de la vida útil del disco permiten mantener el funcionamiento estable de los servicios con mucha carga.



En este artículo, no hemos cubierto todos los aspectos y sutilezas del uso de espacios de nombres. Resultó, más bien, una revisión o un conocido. Sin embargo, espero que esto le ayude a comenzar con un estudio más profundo de la tecnología si lo desea.



Epílogo



Al escribir este artículo me enfrenté a una serie de problemas popabolyu , que me impidieron terminar el trabajo. Tenga cuidado al elegir unidades para probar las diversas capacidades de NVMe. No era la primera vez que conseguía solucionar los problemas y encontrarme un disco que cumpliera mínimamente con mis requisitos. Y los fabricantes de discos son reacios a compartir esa información, y algunos incluso son engañosos, por lo que tuvimos que actuar al azar. Específicamente, me encontré con problemas como este:



  • Las unidades Samsung 970 EVO / 970 EVO Plus con firmware 2b2qexe7 / 2b2qexm7 no implementan los comandos de reinicio y formato;
  • Las unidades Samsung 970 EVO / 970 EVO Plus con firmware 2b2qexe7 / 2b2qexm7 no implementan la administración de espacio mediante los comandos create-ns, delete-ns, detach-ns, atach-ns;
  • Las unidades Samsung PM991 con firmware 9L1QFXV7 tienen un error debido al cual reiniciar el controlador usando el comando de reinicio da como resultado un error;
  • Las unidades Samsung PM991 con firmware 9L1QFXV7 tienen un error debido a que al formatear el espacio con el comando de formato se produce un error;
  • Las unidades Samsung PM991 con firmware 9L1QFXV7 no implementan la administración de espacio mediante los comandos create-ns, delete-ns, detach-ns, atach-ns.


Estoy seguro de que los discos del segmento corporativo están libres de estos problemas, pero no todos pueden permitirse comprar tales piezas de hardware, así que estudie los discos y manuales en detalle al comprarlos. Y si existe la oportunidad de examinar los discos antes de comprarlos y ver los parámetros del controlador NVMe, asegúrese de usarlo.



Fuentes útiles



  1. SSD: dispositivo, componentes y principios de funcionamiento
  2. Un recorrido rápido por NVM Express
  3. Especificación NVMe 1.4
  4. Espacios de nombres NVMe
  5. Base NVM Express — Part One
  6. NVMe Command Line Interface (NVMe-CLI)
  7. NVMe Over Fabrics





All Articles