¿Qué es NVMe y porqué es clave?

Al final de mi último post ya di algunas pistas de cual es la solución frente a la incorrecta aproximación en el diseño/arquitectura de sistemas de almacenamiento All-Flash con dispositivos de alta densidad.
El primer paso a esta solución se dio ya hace algunos años, concretamente en el 2011, cuando se liberó la versión 1.0 de la especificación NVMe y que era en realidad la continuación en forma de mejora y soporte por parte de más de 90 compañías en la industria de la especificación NVMHCI que sacó INTEL en el año 2009. La última versión de la especificación NVMe, la 1.3c, es de mayo del 2018. Es decir, NVMe ya no es algo relativamente nuevo sino que tiene un desarrollo maduro y estable.


Básicamente NVMe (Non-Volatile Memory Express) es un protocolo de alto rendimiento, elevado paralelismo y muy baja latencia que ha sido diseñado específicamente para la conexión de dispositivos de almacenamiento no-volátil (dispositivos de estado sólido, medio flash y NVRAMs) a través del interface PCI Express. El protocolo se ha desarrollado bajo un consorcio formado por bastantes fabricantes de la industria (el NMVe Workgroup) y se ha convertido en un estándar de facto.
Adicionalmente, el protocolo puede ser encapsulado bajo otros protocolos de transporte remoto como Infiniband o RDMA sobre Ethernet Convergente (RoCE), dándo lugar a lo que se conoce como NVMe/f o “NVMe over Fabrics”.

El nacimiento de este protocolo surge para responder a la necesidad de poder liberar todo el potencial en rendimiento y cada vez más baja latencia que presenta la tecnología flash y en general cualquier dispositivo de almacenamiento no-volátil ya que los interfaces y protocolos que se vienen utilizando en la industria de almacenamiento (SATA, SAS, AHCI, SCSI) han sido diseñados para disco rotacional.
Por tanto, NVMe es el catalizador necesario para muchos de los avances que se están produciendo en la industria: procesadores con un número masivo de núcleos, SSDs super-densos con un excelente ratio rendimiento/densidad, nuevas tecnologías de memoria, interconexiones de alta velocidad de datos, etc.
Se prevé que la industria de almacenamiento transicione de manera inminente hacia arquitecturas NVMe durante los próximos años, lo que acelerará la obsolescencia tecnológica de los sistemas de almacenamiento cuyo back-end sigue trabajando con tecnología FC o SAS/SATA.

Algunos detalles técnicos de NVMe

Poco a poco dejaremos de ver SSDs con interface SATA (hablando protocolo AHCI) o SSDs con interface SAS (hablando mediante comandos SCSI) y empezaremos a ver SSDs con interface U.2 (antes conocido como SFF-8639) o interface M.2, o incluso tarjetas flash con interfaces PCIe, que hablan protocolo NVMe. Una de las diferencias más importantes entre el interface M.2 y el U.2 es que el interfaz U.2 es hotplug y además es también compatible con SAS/SATA (de hecho el conector U.2 es similar al SATA Express pero proporciona 4 pistas PCIe 3.0).

Como he mencionado en el párrafo anterior, los interfaces SFF-8639/U.2 y el M.2 facilitan también la transición del conjunto de comandos de manera que aceptan dispositivos SAS/SATA así como NVM; por ejemplo, el SSD Samsung 850EVO es SATA y está disponible en formato SSD SATA de 2,5” y en formato placa/dispositivo M.2 (que es el que tiene el ordenador con el que estoy escribiendo esto), pero el drive sigue siendo SATA.

Considerando que la diferencia entre SATA y SAS ya es conocida por el lector (y si no éste enlace lo resume muy bien) voy a centrarme en las diferencias entre NVMe y SAS (comandos SCSI).

La primera diferencia es que mientras con SCSI solo se utiliza una única cola de comandos por dispositivo, con NVME se pueden tener hasta 64.000 colas de comando por dispositivo de manera simultánea (y además cada una de éstas colas puede admitir a su vez 64.000 comandos). Es decir:
  • SAS = un único canal serie (en realidad dos) con una única cola de comandos por dispositivo (generalmente de 254 comandos o queue_depth de 254).
  • NVMe = un canal extremadamente paralelo que admite hasta 64.000 colas en el caso de NVMe, aunque para un SSD la NVM Express recomienda implementar entre 16 y 128 colas de comandos simultáneas.
Además el conjunto de comandos SCSI es enorme (unos 191 en la especificación básica) mientras que NVMe tiene un conjunto muy reducido (11 comandos para I/O y 15 comandos administrativos).
Es decir, con NVMe es posible poner muchos mas threads de ejecución en IO en paralelo utilizando potencialmente todos los cores de procesador que tenga disponibles. Por tanto a igualdad de tiempo de respuesta mi trabajo debería de tardar bastante menos.

La segunda diferencia importante es el ancho de banda, los números teóricos son:
  • SATA-III = 600 MB/s
  • SAS-3 = 1.2 GB/s
  • SAS-4 está aún en desarrollo (llegará a 2.4 GB/s con una codificación más eficiente)
  • PCI 3.0 (x4) = 3,9 GB/s (lo que se está utilizando actualmente en SSDs NVMe)
  • PCI 4.0 (x4) = 7,6 GB/s
  • PCI 4.0 (x16) llega a unos 32GB/s
Pruebas empíricas que distintos fabricantes han hecho han mostrado una diferencia de 5x menos ancho de banda para un SSD SATA-III y 2,5x menos para un SSD SAS-3 comparado con un SSD PCIe3(x4)/NVMe de tecnología NAND similar. Si miramos las especificaciones de los distintos SSDs de cualquiera de los fabricantes veremos, por ejemplo, que los SSDs SATA-III (6 Gbps) suelen rondar los 500-550MB/s de ancho de banda mientras que los que son PCIe3(x4)/NVMe rondan los 2.500-3.000MB/s.

La tercera diferencia es la latencia o el tiempo de respuesta que NVME elimina en el dispositivo frente a SCSI(SAS), la diferencia entre ambos es de más de un 50% a favor de NVMe. Se han realizado pruebas empíricas entre SSDs con el mismo tipo de medio NAND donde se ha observado que en un SSD SAS/SATA se ven latencias promedio máximas de 1ms y mínimas de unos 200micro-segundos; en el caso del equivalente en PCIe/NVMe la latencias promedio máximas estaban cercanas a los 500micro-segundos mientras que las mínimas no superaban los 100micro-segundos.

La cuarta diferencia es la proximidad a la CPU que ofrece este protocolo y el interface. Una de las cosas que permite NVMe es utilizar multi-channel DMA (acceso directo a memoria) lo que libera ciclos de CPU ya que es posible transferir directamente contenido entre el medio NAND flash y la memoria RAM principal sin que la CPU intervenga y por tanto quede bloqueada en esa fase.


Por tanto, transicionar la fabricación y desarrollo de un medio NAND flash a este protocolo va a permitir romper con la problemática del bajo ratio rendimiento/densidad de los SSDs cada vez más grandes en capacidad e incluso va a permitir la fabricación de medio flash con un encapsulado que mejore aún mas el rendimiento y permita nuevos interfaces de comunicación inteligente con el host (en la Storage Developer Conference de la SNIA del año 2015 ya hablaron de esto algunos especialistas de Samsung, el material de la presentación está aquí).

Algo sobre NVMe/F

Una vez que hemos conseguido evolucionar la capa de almacenamiento local eliminando los cuellos de botella que pesaban sobre ella, el siguiente paso es adoptar este mismo protocolo para la interconexión del almacenamiento externo.
NVMe/f consiste en extender el protocolo NVMe (preservando sus beneficios en latencia, ancho de banda y eficiencia de protocolo) utilizándolo para conexiones externas en entornos cliente/servidor o entornos distribuidos formando una red específica de comunicación denominada fabric (el caso mas típico es el de una red de almacenamiento entre varios servidores y un sistema centralizado de almacenamiento).

Para poder preservar los beneficios del NVMe mencionados anteriormente sobre una fabric se hace necesario un mecanismo específico. Aquí es donde entra en juego el RDMA (Remote Direct Memory Access) y para ello se introduce una capa adicional en la pila de comunicación, gestionada por la controladora de host, que se encarga de convertir las semánticas locales NVMe en semánticas RDMA.

Actualmente se han desarrollado (y aún se continuarán la mejoras sobre ellos) los siguientes tipos de transporte para la fabric NVMe:
  • RDMA, apoyándose en InfiniBand (HCAs Infiniband), RoCE (RDMA sobre Ethernet Convergente, CNAs 10/40 GbE) o iWARP (NICs 10/40 GbE con iWARP).
  • Fibre Channel para NVMe (FC-NVMe)…si parece que Fibre Channel sigue pudiendo con todo (además de SCSI y FICON también puede transportar NVMe con esta nueva especificación).

Comentarios

Entradas populares de este blog

Apache Spark 2.4: hacia la analítica de datos unificada