Stockage : tout comprendre aux performances des SSD NVMe
Le protocole NVMe est spécialement conçu pour accélérer les SSD. Cet article explique comment il fonctionne et comment il se compare aux interfaces SATA et SAS.
Le protocole de stockage NVMe (Non-Volatile Memory Express) est une norme de communications entre un OS et tout type d’unité de stockage dite de mémoire non volatile (Non-Volatile-Memory, ou NVM), soit principalement les SSD. La raison d’être de cette norme est d’apporter un socle technologique plus adapté au fonctionnement des SSD que le sont les protocoles historiques SAS et SATA.
SAS et SATA sont des protocoles de stockage qui ont été développés pour des disques durs, à savoir des unités mécaniques qui perdent beaucoup de temps à déplacer leurs têtes de lecture et qui ont besoin que des en-têtes soient générés par l’ordinateur hôte en amont de chaque bloc de données, de sorte à retrouver ensuite ces blocs sur des disques en rotation. Un disque dur met en moyenne 8 millisecondes pour déplacer ses têtes, plus encore 4 millisecondes pour tomber sur l’information à lire. Le SATA est un protocole conçu pour générer des en-têtes et envoyer de nouveaux paquets pendant une latence de moins de 12 millisecondes.
Les SSD sont des unités constituées de mémoires électroniques NAND (non volatiles) qui n’utilisent ni tête de lecture ni disque en rotation. Les utiliser sur des bus SATA ou SAS est donc un gâchis de performances, car la vitesse ralentie du bus, pour attendre les têtes, comme les cycles processeurs consommés pour générer des en-têtes ne servent à rien. Selon la qualité de son électronique, un SSD va consommer entre 20 et 100 microsecondes pour lire ou écrire dans les cellules de ses mémoires NAND. Soit une latence qui dure entre 600 et 120 fois moins longtemps que celle d’un disque dur.
Plus d’une centaine de fournisseurs informatiques se sont donc réunis au sein d’un consortium, le NVM Express Inc. afin de réécrire de zéro un protocole de stockage qui tire pleinement parti des possibilités des SSD. Initialement, l’idée était de connecter les SSD sur le bus d’extension PCIe des PC et serveurs, bien plus rapide que les bus SAS ou SATA. Mais, afin d’autoriser l’utilisation de SSD externes, il a rapidement été décidé d’ajouter à la norme la possibilité d’envoyer des ordres de stockage à des unités distantes via des liens réseau, à la manière du iSCSI qui revient au protocole SAS transporté sur un réseau TCP/IP.
On trouve aujourd’hui le protocole NVMe tout court pour les SSD connectés dans une machine, le NVMe/TCP (ou NVMe-over-TCP) pour parler aux SSD qui se trouvent dans un autre serveur sur le réseau local, mais aussi le NVMe/RoCE (alias NVMe-over-RoCE). Celui-ci consiste à utiliser les mêmes liens Ethernet que le réseau local, mais sans le protocole TCP/IP qui ajoute lui aussi des en-têtes à chaque paquet.
RoCE signifie RDMA-over-Converged-Ethernet. L’Ethernet « convergé » est un réseau Ethernet suffisamment simple pour se passer du dispositif censé gérer la perte de paquets sur des réseaux compliqués. RDMA est le protocole qui consiste à véhiculer des paquets avec si peu d’en-tête qu’ils peuvent entrer directement dans la mémoire de la cible sans passer par une étape de décodage.
Le maître-mot de ces normes est donc l’optimisation maximale du transfert de données pour tirer au maximum profit de la haute vitesse des mémoires NAND.
Performances matérielles grâce au bus PCIe
Le bus PCIe reste le principal moyen de connexion utilisé pour les équipements NVMe. Son intérêt est que chaque slot dispose de sa propre connexion dédiée, ce qui évite aux SSD de se disputer la bande passante.
Les extensions conformes à la norme PCIe peuvent avoir de 1 à 32 voies (ou canaux) de communications parallèles pour transmettre les données (les lanes, en anglais). La norme définit sept configurations physiques de voies : x1, x2, x4, x8, x12, x16 et x32. Les configurations sont basées sur le nombre de voies utilisées. Par exemple, une configuration x8 utilise huit voies. Plus il y a de voies, meilleures sont les performances, mais plus les coûts sont élevés.
La génération du bus PCIe est un autre facteur qui influe sur les performances. En général, chaque nouvelle génération double la bande passante et le débit de transfert de la génération précédente. Par exemple, PCIe 3.0 offre un débit de transfert de 8 gigatransferts par seconde (GT/s) ; PCIe 4.0 double le débit de transfert à 16 GT/S ; PCIe 5.0 double à nouveau le débit à 32 GT/s ; et PCI 6.0 offre un débit de 64 GT/s.
Les GT/s équivalent in fine aux Gbit/s qu’on utilise pour décrire la vitesse sur un lien réseau, mais ici par voie de communication PCIe. Ainsi les 32 GT/s du PCIe 5.0 correspondent à sa capacité de communiquer 32 milliards de bits utiles par seconde sur chacune de ses voies. Il faut ensuite diviser ce nombre par 8 pour obtenir la vitesse en Go utiles, soit 4 Go/s par voie. Si le marché insiste pour parler de GT/s plutôt que de Gbit/s, c’est parce que les transferts correspondent à des paquets encodés de bits. Sur les premières générations PCIe 1.0 et 2.0, il fallait 10 bits encodés pour transférer 8 bits utiles. Depuis la génération 3, il faut 130 bits encodés pour transporter 128 bits utiles.
Bref, des SSD NVMe qui seraient capables d’utiliser 16 voies en PCIe 6.0 offriraient en théorie des débits atteignant près de 256 Go/s. Pour autant, la plupart des SSD NVMe actuels sont basés sur PCIe 4.0 ou 5.0 et sont généralement des appareils à quatre voies. La bande passante maximale à laquelle ils ont accès est donc de 8 ou 16 Go/s, respectivement.
Comparativement, un bus SATA (il n’existe pour ainsi dire pas de SSD en SAS) ne propose qu’une seule voie de communication et celle-ci est limitée à 6 Gbit/s. Soit 600 Mo/s, moins les entête des blocs qui ne sont pas des données utiles.
Attention : il faut toujours prendre en compte que c’est la génération la plus ancienne d’un bus PCIe qui imposera sa vitesse. Un SSD de génération PCIe 4.0 installé dans une machine avec des bus PCIe 5.0 ira à la vitesse du PCIe 4.0. De même, un SSD de génération PCIe 6.0 installé dans une machine avec des bus PCIe 5.0 ira à la vitesse du PCIe 5.0.
Les limites de la NAND par rapport aux capacités du bus PCIe
Cependant, les débits réels des SSD sont plus ou moins inférieurs à cette bande passante selon les modèles de SSD. Deux des meilleurs SSD actuels sont le Kioxia CM7 et le Micron 9550. Tous deux sont des modèles PCIe 5.0 qui offrent des débits allant jusqu’à 14 Go/s.
On parle également d’IOPS (accès par seconde). Cette mesure prend en compte le temps de latence de l’électronique d’un SSD pour faire des opérations de lecture ou d’écriture sur ses cellules NAND avant d’accepter de communiquer à nouveau avec l’ordinateur hôte. Selon la qualité de l’électronique d’un SSD, les IOPS peuvent varier de quelques dizaines de milliers à quelques millions. Le SSD Kioxia mentionné peut fournir jusqu’à 2,7 millions d’IOPS, tandis que le SSD Micron promet 3,3 millions d’IOPS. La latence est parfois clairement exprimée dans la fiche technique d’un SSD. Elle varie généralement de 20 à 100 microsecondes.
Le modèle le plus performant en PCIe 4.0 est le Samsung 990 Pro. Son débit peut atteindre 7 Go/s et ses IOPS plafonnent à 1,4 million.
Ces chiffres doivent être considérés comme des valeurs maximales. L’usage d’un SSD conditionne des ralentissements supplémentaires. Ainsi les Kioxia CM7 et Micron 9550 liront un fichier de 14 Go en 14 Go/s, mais ils mettront plus de temps à lire 14 fichiers de 1 Go chacun. L’écriture est soit moins rapide que la lecture, car le processus d’écriture d’une cellule NAND est autrement plus compliqué que son processus de lecture, soit plus rapide, car le SSD peut intégrer une mémoire cache faite de composants de DRAM très rapides et dans lesquels il écrit.
À cela s’ajoutent des détails totalement aléatoires. On écrit plus rapidement dans une cellule NAND vide que dans une cellule NAND où existent déjà des bits. Les données à lire peuvent se trouver dans la mémoire cache interne. Etc.
Performances logiques du bus PCIe
Le bus PCIe offre aussi un ensemble plus rationnel de commandes pour traiter les demandes d’entrées/sorties (E/S), par rapport au SATA ou au SAS. Un SSD NVMe nécessite moins de la moitié du nombre d’instructions CPU et offre un système plus complet et plus efficace pour la mise en file d’attente des messages. Par exemple, SATA et SAS ne prennent en charge qu’une seule file d’attente d’E/S à la fois. Et cette file ne peut contenir que 32 commandes en attente en SATA, ou 256 en SAS. En NVMe, 65 535 files d’attente sont gérées et chacune peut empiler 65 535 commandes en attente.
Ce mécanisme de mise en file d’attente permet au protocole NVMe de mieux exploiter les capacités de traitement parallèle d’un SSD, ce que les autres protocoles ne peuvent pas faire.
Mais, surtout, le protocole NVMe revient à du RDMA : chaque bloc de données transmis est simplement écrit à un endroit du SSD, comme si l’on copiait juste un bloc en RAM. En SAS et SATA, des protocoles conçus à l’époque pour des disques durs mécaniques, les blocs doivent être dotés d’en-têtes pour que le système de fichier sache les retrouver sur une surface magnétique en rotation. L’accès NVMe réduit donc encore davantage la charge du CPU et améliore la vitesse expérimentée sur un SSD. En conséquence, chaque cycle d’instruction du CPU peut prendre en charge un nombre plus élevé d’IOPS et réduire les latences dans la pile logicielle de la machine hôte.
Optimisations possibles grâce aux fonctions de la norme NVMe
La norme NVMe repose sur un ensemble de modules fonctionnels qui caractérisent les communications entre un ordinateur et ses SSD. À partir de la version NVMe 2.1, la norme comprend les 11 modules suivants :
- NVMe Base : définit le protocole permettant la communication avec des SSD, quel que soit le protocole de transport utilisé pour les atteindre (PCIe, TCP, RoCE).
- NVMe Command Set : lecture/écriture/maintenance des données stockées.
- NVMe Zoned Namespaces Command Set : prise en compte de l’emplacement des cellules de NAND de sorte à pouvoir minimiser leur usure selon les usages.
- Key Value Command Set : stockage de données de tailles variables plutôt que par blocs de même taille, ce qui économise de l’espace et accélère les systèmes de stockage qui en tirent parti (par exemple DAOS).
- Subsystem Local Memory Command Set : accès à la mémoire DRAM embarquée dans un SSD NVMe pour mieux gérer son cache.
- Computational Programs Command Set : exécution de code directement sur la puce embarquée dans un SSD.
- NVMe over PCIe Transport, NVMe over RDMA Transport et NVMe over TCP Transport : chacun pour optimiser les transferts selon l’infrastructure de communication utilisée.
- NVM Express Management Interface : administration (découverte automatique, configuration, échanges formatés d’informations fonctionnelles, gestion des erreurs, réaffectation à chaud…) des unités NVMe connectées.
- NVMe Boot : processus standardisé pour le démarrage d’une machine depuis une unité NVMe.
La norme NVMe 2.1 date du 6 août 2024. Ses apports les plus importants sont les modules Subsystem Local Memory Command Set et Computational Programs Command Set, qui permettent tous deux à la machine hôte de véritablement prendre le contrôle de l’électronique d’un SSD afin de pousser son optimisation jusque dans ses derniers retranchements.
Les autres modules ont bénéficié d’une vingtaine d’améliorations. Parmi celles-ci, la possibilité de basculer à chaud sur une autre unité SSD (ou un autre tiroir de SSD), l’identification des switches réseau susceptibles de donner accès à des unités NVMe externes et la découverte automatique de ces unités, si elles existent, ainsi que la gestion plus granulaire des SSD dans un tiroir de plusieurs unités, et ce qui va avec, la gestion plus fine de la haute disponibilité entre unités redondantes.
Accessoirement, la version 2.1 standardise la manière dont les unités NVMe partagent leurs informations. Cela va d’un formalisme précis pour mieux prendre en charge les protocoles de sécurité intégrés dans certains SSD, à une taille plafonnée pour les relevés d’activité, en passant par des alertes comme celle qui permet à un serveur de prévenir des unités qu’il va basculer en mode basse consommation.
