NVMe : vers l’infini et au delà !

EDIT du 28/08, précisions sur la comparaison AHCI/NVMe. Merci à Fabrice pour les remarques !

Je me rappelle, c’était en 2010 : mon premier SSD OCZ Vertex 2 de 240 GO (à plus de 500€, tout de même) venait d’arriver sur mon PC personnel, une petite révolution. Comme souvent désormais, les nouvelles technologies arrivaient déjà par le grand public avant d’envahir le monde professionnel et le SSD ne dérogeait pas à la règle. Un renversement de tendance constaté depuis le milieu des années 2000, en gros, avec l’avènement de l’informatique Open basée sur des technologies standardisées, par opposition du monde Mainframe globalement propriétaire.

Depuis, le “Solid Stat Drive” a fait du chemin, c’est le moins qu’on puisse dire ! A tel point qu’il est en train de progressivement détrôner le disque à plateau pour le stockage primaire. Il faut dire que ce dernier a sans doute fait son temps depuis sa première commercialisation dans les années 60…

Avec des temps de réponse de l’ordre de de la milli-seconde et surtout un vrai déterminisme de ces même temps d’accès on comprend facilement l’intérêt aujourd’hui d’une telle technologie pour nos SLA chéris ;) . Grâce au SSD, on a rapproché la donnée du processeur et ainsi révolutionné la notion même de proximité de cette même donnée. Cependant, afin de pouvoir assurer une continuité dans les formats physiques et les bus de données utilisés dans l’industrie et en assurer une adoption rapide, il a fallut faire des compromis : le SSD reste intrinsèquement “bridé” par le bus sur lequel il est connecté (classiquement du SATA ou du SAS aujourd’hui).

Ce faisant, les industriels se sont très rapidement attelés à faire sauter ce verrou et continuer à rapprocher encore plus la donnée stockée du CPU : le NVMe était né.

NVMe, c’est tout neuf non ?

Pas si neuf que ça ! En effet, les premiers papiers sont sortis en 2007 ! A peine quelques années après l’arrivé du flambant neuf PCI express et au même moment que la publication de la v2.0 de ce bus … quelle coincidence :)

Issu des travaux combinés de grands noms de l’IT comme Cisco, Dell EMC, Intel, Micron, NetApp, Samsung mais aussi, Microsoft et Oracle (la liste exhaustive est disponible sur le site officiel du consortium), le NVMe a connu pas mal de releases depuis sa version 1.0 en 2011, mais c’est depuis environ 2 ans que le “tout IT” en entend vraiment parler et que cette nouvelle interface de connexion des SSD fait le buzz.

Ok, donc ça fait longtemps qu’on bosse dessus, mais finalement, c’est pas une “norme de plus”, c’est bien le SCSI non ?

Commençons par faire un petit retour sur ce que l’on utilise aujourd’hui. Vous savez certainement que les protocoles de connexion historiques comme SCSI, SATA ou SAS sont tous basés sur le principe de l’échange de messages entre l’hôte et le “support” : j’envoie une demande, elle est acquittée, traitée et le disque renvoie le résultat (les données réclamées ou l’état de l’opération terminée).

Il y a eu pas mal d’évolution dans la façon de gérer ces messages de type “entrée/sortie”, notamment avec le AHCI et ses fonctions spécifiques comme le NCQ (la possibilité d’envoyer des requêtes en rafale sans en attendre le résultat, ce qui permet par exemple, au récepteur de réordonner ces requêtes pour les optimiser). Mais, vous l’aurez compris, fondamentalement, on reste sur une approche très séquentielle.

C’est là qu’intervient la “magie” du NVMe : là ou un support “classique” ne comporte qu’une seule queue de traitement des I/O, le support NVMe en propose pas moins de 65000 ! Chacune de ces queues est indépendante et peut exécuter séparément les requêtes qui lui sont envoyées. Imaginez un seul disque logique, mais composé de 65000 disques physiques derrière, prêts à répondre à toute sollicitation. Le décor est posé : la seule manière d’aller assez vite coté stockage, c’est de travailler avec de “la mémoire non volatile”, évidemment, d’où l’acronyme NVM. Le NVMe propose également un jeu d’instruction réduit et spécifique à la technologie mémoire utilisée, d’où un gain de temps dans le traitement des I/O.

Le coin de l’IT Nerd (EDIT du 28/08)

Un collègue m’a fait remarquer que le ratio AHCI/NVMe n’était pas “si défavorable que cela” et que c’était en réalité plus compliqué que de comparer deux nombres. Effectivement, il faut relativiser un peu, mais je voulais surtout vous présenter les grandes lignes sans trop rentrer dans l’implémentation technique. Pour les plus acérés d’entre vous, je vous conseille un document très intéressant détaillant, par le menu, les différences entre les deux protocoles, à consulter ici. Malgré tout, voici quelques informations importantes issues de ce document :
– Aggregation Point vs. End Point : Le NVMe est fondamentalement un protocole de type “End Point” : en connexion directe avec le périphérique. Le AHCI quant est lui est avant tout un protocole d’aggrégation de ports (32 max).
– 64K Queues vs. 32 Ports : Plus de 65535 files d’attentes pour le NVMe, à comparer aux 32 ports du AHCI, soit une queue par périphérique.
– 64K Command Queue Depth vs. 32 Command Queue Depth : Pour chaque file d’attente, le NVMe permet la soumission de 65535 commandes (similaire au NCQ). A comparer aux 32 commandes par périphérique pour le AHCI.
– 9 Register Read/Writes vs. 2 Register Writes for a Command Issue/Completion Cycle : Le NVMe divise par 4 le nombre d’opérations nécessaires pour soumettre une commande.
– Single Interrupt vs. Support For Multiple MSI-X Interrupts : AHCI s’appuie sur une seul interruption processeur. Le NVMe quant à lui supporte autant d’interruptions que de files d’attentes de commandes (Command Queues).
– Parallel Access to a Single Namespace vs. Serial Access to a Port : Le NVMe supporte le partitionnement d’un périphérique unique et l’accès se fait en parallèle pour chaque partition. A opposer à l’accès en série de chaque port du AHCI.

Bon, ok, c’est un support badass, mais je le connecte à quoi moi ? j’achète quoi comme cable ?

Certes, pour pouvoir abreuver ce support de stockage aux propriétés extraordinaires, il faut un bus du même calibre pour le connecter avec le reste de la machine, c’est pourquoi on s’est naturellement tourné vers le PCI Express : ses qualités principales en faisaient en effet le candidat idéal (latence très faible, agrégation de lignes possible, proximité avec le processeur, standard de l’industrie etc.). C’est la signification du “petit e”‘ présent après NVM. Super, vous savez désormais pourquoi cette nouvelle norme a le nom qu’elle a, chouette hein :)

Pour résumer, un “disque” NVMe est un stockage “flash” sous forme de carte fille connectée au bus PCI express d’une machine et qu’on pilote grâce au protocole NVMe.

Heu, pardon mais le PC express c’est pas le top pour faire des dizaines de mêtre, je fais comment pour brancher ma “baie NVMe” à mon “serveur NVMe” ?

En effet, sur le papier c’est génial, mais dans la pratique vous savez surement que le PCI express, par nature, a du mal à passer les portes de l’intérieur d’un PC. Il est difficile de se maintenir dans la norme au delà de quelques mêtres. De plus, le PCI express reste fondamentalement un bus “système” dont les spécifications ne sont pas compatibles avec une communication multi-host. D’ailleurs, aujourd’hui encore, le NVMe est quasi exclusivement cantonné à une utilise locale, typiquement des cartes d’accélération/de cache dédiées aux machines sur lesquelles elles sont installées. Pensez au “cache TIER” de VSAN par exemple, un parfait usage pour un disque NVMe.

Il fallait de facto trouver le moyen d’émanciper le NVMe à sa majorité, lui permettre de devenir un concurrent frontal du stockage “SAN” partagé bien connu des productions informatiques. Pour cela, les industriels ont développé une extension du protocole NVMe appelée “NVMe over fabrics”. Sur le principe, on revient à un pilotage du stockage par échange de messages, dont on parlait plus haut avec nos protocoles historiques, mais en imposant tout de même des temps de traitement compatibles avec le niveau de performance exigé par sur le support : pas plus de 10 micro-secondes de temps de transit (outch !). Il faut dire que cette extension est, en dehors de ces spécifications théoriques, totalement agnostique au hardware utilisé, c’est pourquoi aujourd’hui, le NVMe over FibreChannel et le NVMe over RDMA (Infiniband, par exemple) sont les deux premiers gros chantiers de standardisation. Il est d’ores et déjà prévu d’y ajouter l’Ethernet dans un futur proche.

L’industrie est en train de travailler d’arrache-pied pour concevoir une séries d’équipements basés sur ce nouvel étalon de la performance sans compromis : des cartes “HBA” sachant discuter NVMe, des controleurs et des boites de disques PCI express pour y loger des paquet de support NVMe plus chers les uns que les autres ^^. Nul doute que l’on devrait avoir des annonces bientôt.

Ok, le NVMe c’est top, cher, et c’est le fioutchoure … mais sinon, pour moi, dans ma petite production de 150/200 VMs, ça me sert à quoi ?

Bonne question ! Ce qu’on peut dire aujourd’hui, c’est que l’implantation du NVMe au sein de nos datacenters commence a être visible grâce à l’adoption croissante des SDS et leurs besoins en caches locaux rapides. Comme déjà évoqué, un cluster VSAN composé de serveurs avec des cartes NVMe en guise de cache tier pourra tirer grandement partie des performances exceptionnelles de ces supports.

De même, certains workloads dévolus aux clusters de calcul capables de segmenter le volume de données à traiter en tireront un bénéfice très important.

D’ailleurs, dans un autre ordre d’idées, le NVMe est aussi un challenge important pour les constructeurs vis à vis du dimensionnement global des serveurs sur lesquels il est implanté. Le nerf de la guerre, plus encore qu’avec les SSD, consiste à proposer des composants particulièrement équilibrés pour éviter tout bottleneck, sans quoi, le retour sur investissement risque de ne pas être à l’avantage de cette nouvelle technologie.

Nul doute que le NVMe et son extension “over fabrics” est l’avenir du stockage haut-de-gamme dans les prochaines années, ce que le SSD a été à partir du début des années 2013-2014.

Personnellement, je ne suis pas persuadé que NVMe “over” ait un avenir si florissant. L’hyper-convergé et l’orientation de toute l’industrie vers le commodity hardware me font plutôt imaginer une conversion progressive du stockage local vers le tout NVMe, avec des capacités et des performances distinctes en fonction des workloads. De même s’il fallait retenir un champion, j’opterais pour le futur NVMe over Ethernet, convergence des réseau oblige.

Maiiiiis, comme l’a dit une peluche verte dans un vieux film, toujours en mouvement est l’avenir …

NOTA BENE : j’ai bien fait attention à ne pas dire – trop – de bêtises dans ce billet pour vous fournir l’information la plus fiable possible. Cependant, si vous détecter des coquilles, n’hésitez pas à me contacter pour amender/corriger des points spécifiques. Merci d’avance pour votre contribution !

Pour aller plus loin …

Voici quelques unes des sources que j’ai utilisé pour la rédaction de ce billet :
AHCI : https://fr.wikipedia.org/wiki/Advanced_Host_Controller_Interface
NVMexpress : http://www.nvmexpress.org/about/
NVMe for absolute beginners : https://blogs.cisco.com/datacenter/nvme-for-absolute-beginners
NVM over FC : http://searchsolidstatestorage.techtarget.com/definition/NVMe-over-FC-Nonvolatile-Memory-Express-over-Fibre-Channel
Why FibreChannel is the fabric of choice for NVMe ? : http://www.brocade.com/content/dam/common/documents/content-types/feature-guide/brocade-nvme-fc-choice.pdf
NVMe over fabrics moves into the Future : http://www.nvmexpress.org/wp-content/uploads/NVMe_Over_Fabrics.pdf
A comparison between AHCI and NVMe : https://www.sata-io.org/sites/default/files/documents/NVMe_and_AHCI_long.pdf

Démarrer la discussion sur le forum vBlog.io