# NVM Express

NVM Express (Non-Volatile Memory Express, kurz NVMe) ist ein im Jahr 2011 veröffentlichtes Softwareprotokoll, um SSDs (Solid State Disks) über die physische Schnittstelle PCI Express zu verbinden, ohne dass dafür herstellerspezifische Treiber nötig sind. NVM ist die Abkürzung von non-volatile memory, deutsch nichtflüchtige Speicher, und steht für SSDs. NVMe soll besonders bei parallelen Zugriffen, wie sie bei Multithreading häufig vorkommen, die Geschwindigkeit erhöhen, indem die Latenz und der Overhead durch die Befehle verringert werden.
NVMe ist damit bei den Massenspeicherschnittstellen in einer Reihe mit SCSI und AHCI zu nennen, da sie aus der Sicht des Computers generische Softwareschnittstellen sind, um unterschiedliche Massenspeicher ohne eigene Treiber anzusprechen.
Treibende Kraft hinter dem Standard ist Intel, daneben sind die Hersteller von Speicherlösungen wie NetApp, Dell Technologies, Cisco Systems, EMC Corporation, Marvell Technology Group und die Speicherhersteller SanDisk, Avago Technologies, Micron Technology, HGST, Samsung und Seagate Technology involviert.
Ursprünglich wurde NVMe vornehmlich für Server entwickelt, mittlerweile wird die Technik auch bei Workstations und normalen Desktop-PCs, Spielekonsolen sowie professionellen Kameras genutzt. Daher sind inzwischen sehr unterschiedliche Bauformen von NVMe-Geräten erhältlich:
* CFexpress- und SD-Express-Speicherkarten
* E1 oder NGSFF (Next Generation Small Form Factor)
* M.2-Karten
* PCI-Express-Karten
* SFF- (Small Form Factor) oder 2,5"-Geräte mit U.2-Anschluss

## Vergleich AHCI und NVMe
### AHCI

* Die AHCI-Schnittstelle ist eine Schnittstelle zur Ansteuerung von SATA-Geräten über einen Controller oder Host-Bus-Adapter (HBA), also einen Bus-Übersetzer PCI(e) zu SATA; es ist damit immer eine Kommandoübersetzung enthalten, die die Latenzen vergrößert (der AHCI-Controller wird auch „Aggregation Point“ genannt).
* Der AHCI-Standard ist ein Softwarestandard für die Nutzung von SATA-Geräten, welche auf den noch älteren ATA-Geräten basieren; die ATA-Kommandos wurden in AHCI weiter benutzt, für SSDs um ein Trimm-Kommando (Löschen) erweitert. Dieser Kommandosatz ist für mechanische Laufwerke (Magnetfestplatten oder optische Laufwerke) erdacht.
* Der AHCI-Standard unterstützt Native Command Queuing, die Umsortierung von Kommandostapeln durch das Gerät
* Hotplug wird unterstützt, wenn das Gerät und die Verbinder dies unterstützen.
* Je Controller sind maximal 32 Ports (Geräte) möglich.
* je 32 Kommandos pro Port in der „Command Table“ (genannt „Slots“) zu je 8 ATA Kommandos (genannt „Command List“)
* Die Geräte liefern Daten in Form von PRDT-Einträgen („Physical Region Descriptor Table“) an den Host zurück; eine „command table“ kann bis zu 65535 PRDT-Einträge haben.
* 6 oder 9 (NCQ) Register Read/Writes je Kommando erforderlich
* ein Interrupt je Gerät und Transfer erforderlich/möglich

### NVMe

* NVMe wurde für persistente Festkörperspeicher entwickelt mit einem neuen, (für diese Geräteklasse kleinen) Kommandosatz. Es wurde von vornherein darauf geachtet, ein sehr hohes Maß an Parallelität beim Zugriff auf NVMe-Geräte zu ermöglichen:
** Je Zugriff wird ein IO Channel oder Command Submission Queue mit je einer Command Completion Queue definiert; 65535 Channels sind möglich.
** Je Completion Queue ist ein Interrupt möglich/erforderlich.
** Je IO Channel sind 65535 Einträge möglich.
** Nur 2 Register-„Writes“ je Kommando erforderlich
* NVMe-Geräte sind PCIe-Geräte, sie nutzen also direkt das PCIe-Protokoll und brauchen keine Protokollübersetzer, HBA oder Controller (auch „Endpoint“ genannt).
* Hotswapping wird über die PCIe-Funktionen realisiert.
* „NVMe Namespaces“ sind als Partitionen eines physischen Gerätes definiert; die „IO Channels“ hängen an einem Namespace.
* Multi-Pathing ist definiert.
* Zum Booten einer NVMe-SSD muss das UEFI in den nativen Modus geschaltet sein. Das Booten per Legacy BIOS Mode, technisch UEFI-CSM (für Compatibility Support Module, ein Modul zur BIOS-Emulation), wird nicht unterstützt.

## NVMe over Fabrics

Eine Weiterentwicklung des NVMe-Standards ist NVMe over Fabrics (kurz NVMe-oF). Diese Protokollerweiterung definiert zwischen NVMe-Gerät und Computer bzw. dem PCI-Express-Bus des Computers die Ebene eines Netzwerkverteilers (der „Fabric“) und macht es damit möglich, die Massenspeicher aus einem Computer zu lösen, um die Auslastung und Verfügbarkeit zu erhöhen. Auf der Netzwerkebene wird auf vorhandene Hard- und Software-Techniken des Remote Direct Memory Access zurückgegriffen (InfiniBand, RDMA over Converged Ethernet-RoCE, Internet Wide Area RDMA Protocol-iWARP).
NVMe over Fabrics ist nicht direkt vergleichbar mit einem Storage Area Network, da auch hier wie beim NVMe-Protokoll die Ebene des Massenspeicher-Controllers entfällt, um die Latenzen niedrig zu halten. Man kann sich ein über Fabrics verbundenes Array von NVMe-Massenspeichern wie ein JBOD (Just a Bunch of Disks) vorstellen.

## Ähnliche Standards

Überschneidungen gibt es mit folgenden Standards, welche die Steckverbinder definieren und elektrisch PCI-Express übernehmen:
* mSATA – Hier ist der mechanische Stecker dem Mini-PCI-Express entliehen und kleiner als SATA.
* M.2 – Nachfolger von mSATA mit nochmals verkleinertem Stecker, basierend auf PCI Express und NVMe
* U.2 – Schnittstelle für Workstations und Storage-Server, basierend auf PCI Express und NVMe, erweitert um Hot-Swap-Funktion
* SATA Express, kurz SATAe, ist der aktuelle Nachfolger von SATA 6G, basiert auf PCI Express 3.0 und ist vornehmlich für Desktop-PCs gedacht. Bis auf den Stecker fast identisch zu M.2, nutzt allerdings nur zwei PCIe-Lanes, wodurch es erheblich langsamer ist