NVM Express

NVM Express（缩写NVMe），或称非易失性内存主机控制器接口规范（Non-Volatile Memory Host Controller Interface Specification，缩写：NVMHCIS），是一个逻辑设备接口规范。它是基于装置逻辑接口的汇流排传输协定规范（相当于通讯协议中的应用层），用于-{zh-hans:访问;zh-tw:存取;}-通过PCI Express（PCIe）总线附加的非挥发性记忆体介质（例如采用快闪记忆体的固态硬碟机），虽然理论上不一定要求PCIe汇流排协定。NVMe是一种协议，是一组允许SSD使用PCIe总线的软硬件标准；而PCIe是实际的物理连接通道。
NVM代表非挥发性记忆体（non-volatile memory）的首字母缩略字，这是固态硬盘（SSD）的常见的闪存形式。此规范主要是为基于快闪记忆体的存储装置提供一个低延时、内部并行化的原生界面规范，也为现代CPU、电脑平台及相关应用提供原生存储并行化的支援，令主机硬体和软体可以充分利用固态存储装置的并列化存储能力。相比此前机械硬碟机（HDD）时代的AHCI（SATA下的协议），NVMe/NVMHCI降低了I/O操作等待时间、提升同一时间内的操作数、更大容量的操作队列等。
依托于PCIe汇流排，NVMe装置可适用于各种支援PCIe汇流排的物理插槽上，包括标准尺寸的PCIe扩展卡（一般是4个PCIe通道）、采用U.2物理连接界面（SFF-8639）的2.5英寸/3.5英寸标准尺寸固态硬碟机、SATA Express汇流排（相容于PCIe）的装置、M.2规格扩展卡等。此规范由NVMHCIS工作组负责管理。

**背景**
历史上，大多数SSD使用如SATA、SAS或光纤通道等接口与计算机接口的总线连接。随着固态硬盘在大众市场上的流行，SATA已成为个人电脑中连接SSD的最典型方式；但是，SATA的设计主要是作为机械硬盘驱动器（HDD）的接口，机械结构的HDD使用读取臂做读写，与直接操作固态颗粒的SSD差异很大，并随着时间的推移越来越难满足速度日益提高的SSD。随着在大众市场的流行，许多固态硬盘的数据速率提升已经放缓。不同于机械硬盘，部分SSD已受到SATA最大吞吐量的限制。
在NVMe出现之前，-{zh-hans:高端;zh-tw:高阶;}-SSD只得以采用PCI Express总线制造，但需使用非标准规范的接口。若使用标准化的SSD接口，操作系统只需要一个驱动程序就能使用符合规范的所有SSD。这也意味着每个SSD制造商不必用额外的资源来设计特定接口的驱动程序。
截至2014年9月，在光纤通道（FC）上使用NVMe的新标准也正在开发。
截止2018年，NVMe包含NVMe、NVMe-MI以及NVMe-oF（NVMe over Fabrics）三个细分协议，其中NVMe为主协议，规范了host对盘的读写、-{zh-hans:访问;zh-tw:存取;}-以及资源管理等功能，NVMe-MI主要包括带外管理相关的功能，NVMe-oF主要是基于NVMe的网络协议规范，可以将FC等网络协议与NVMe进行结合起来。同时，并且三个协议在协同演进，未来将会围绕NVMe形成一个从盘到存储系统的端到端生态。

**PCI Express与传统的SATA差异**
NVMe标准对比AHCI标准：
*当数据从存储传输到服务器主机时，会进入一行或队列。传统的SATA连接只能支持一个队列，一次只能接收32条数据。而NVMe存储支持最多64000个队列，每个队列有64000个条目。
*NVMe使用原生PCIe通道，免去了SATA与SAS接口的主机控制器与CPU通信所带来的延时。NVMe标准的延时只有AHCI的一半不到：NVMe精简了调用方式，执行命令时不需要读取寄存器；而AHCI每条命令则需要读取4次寄存器，一共会消耗8000次CPU循环，从而造成大概2.5微秒的延迟。
*NVMe支持同时从多核处理器接受命令和优先处理请求，这在企业级的重负载时优势明显。
*NVMe加入了自动功耗状态切换和动态能耗管理功能。设备从Power State 0闲置50ms后可以切换到Power State 1；继续闲置的话，在500ms后又会进入功耗更低的Power State 2，切换时会有短暂延迟。SSD在闲置时可以非常快速的控制在极低的-{zh-hans:水平;zh-tw:水准;}-，在功耗管理上NVMe标准的SSD会比AHCI SSD拥有较大优势。

**历史**
2009年Intel开始着手寻找SATA的替代方案。SATA作为串行接口，采用AHCI规范，其已经成为制约SSD速度的瓶颈。AHCI只有1个命令队列，队列深度32。而NVMe可以有65535个命令队列，每个队列都可以深达65536个命令。NVMe也充分使用了MSI的2048个中断向量优势，延迟大大减小。最新的版本是2.0c；最大带宽约为16GB/s。
2018年，基于NVMe的SSD已经可以突破15TB可用容量，读带宽达到6GB/s，100万IOPS（4KB随机读），同时保证微秒级延迟。
产品规格：- 1.0e（2013年1月）- 1.1b（2014年7月）- 1.2（2014年11月）
** 1.2a（2015年10月）
** 1.2b（2016年6月）
** 1.2.1（2016年6月）- 1.3（2017年5月）
** 1.3a（2017年10月）
** 1.3b（2018年5月）
** 1.3c（2018年5月）
** 1.3d（2019年3月）- 1.4（2019年6月）
** 1.4a（2020年3月）
** 1.4b（2020年9月）- 2.0（2021年5月）
** 2.0a（2021年7月）
** 2.0b（2022年1月）
** 2.0c（2022年10月）

**作业系统支援**
Linux内核的存储控制堆叠中，NVMe的资料路径、不同层面下多重内部队列的位置
 9Front
 2017年3月30日，NVMe驱动程式释出并供使用
 Chrome OS
 2015年2月24日，加入NVMe驱动至内核和开机载入程式，可从NVMe装置启动Chrome OS
 DragonFly BSD
 DragonFly 4.6开始内建NVMe驱动程式
 FreeBSD
 Intel赞助开发的驱动程式已内建于FreeBSD的head、stable/9分支中。nvd(4)和nvme(4)驱动程式则是在10.2版FreeBSD中开始预设内建于其中。
 Haiku
 Haiku已有驱动开发时程，但是目前仍未完成
 illumos
 illumos于2014年10月15日获得驱动程式支援
 iOS
 iOS 9开始支援，首款配备了NVMe介面的装置是iPhone 6S/6S Plus，也是首款采用NVMe的行动装置。物理介面和UFS相同的采用M-PHY PCIe。接下来Apple推出的iPad Pro和iPhone SE也采用了NVMe
 BLKMQLinux
 NVMe的驱动程式最早是英特尔提供的，适用于Linux的内核驱动程式模组。这个模组在2012年3月19日整合到Linux内核的主线驱动程式当中，Linux内核3.3版开始内建支援而无需安装额外模组。
 NVMe采用了多队列设计，最高支持64k个队列。2014年1月19日的Linux内核 3.13版开始，block层增加了multi-queue block layer，这一模块可以充分利用多核CPU和底层高速SSD硬件资源，主机CPU的I/O提交队列可以与SSD侧的提交队列进行绑定，即是说每个CPU核可以与SSD硬件的队列进行1：1或者n:m（比值取决于硬件设计）进行配置。对上层应用仍然是通用的块接口。从应用的角度，在某一个CPU Core上产生的IO请求，中断也会在此CPU Core处理, 性能更优。在SSD性能不是瓶颈的情况下，应用的性能能够实现在多核环境下按照CPU Core的数量扩展，这点与AHCI的CPU单队列-{zh-hans:访问;zh-tw:存取;}-存储设备的机制有所不同。
2015年4月12日发布的Linux内核 4.0版开始，VirtIO区块层驱动程式，SCSI驱动层（与SATA驱动共用）、回环装置驱动（loop device） UBI（unsorted block images）驱动（供快闪记忆体实作区块擦写管理）以及RBD驱动程式（which exports Ceph RADOS objects as block devices）都被修改，以适应及适配越来越多的NVMe装置
 NetBSD
 NetBSD在2016年的开发版本中初步支援NVMe。
 OpenBSD
 OpenBSD的NVMe驱动程式自2014年6月开始，由此前开发并释出USB、AHCI驱动程式的高级开发团队负责。OpenBSD 6.0开始正式支援。
 OS X/macOS
 Mac OS X 10.10.3（OS X Yosemite）开始支援NVMe。苹果公司的Retina MacBook和2016年发布MacBook Pro，配备了使用NVMe的PCIe SSD作为主硬碟机使用。
 Solaris
 Solaris自Oracle Solaris 11.2开始支援NVMe。
 VMware
 英特尔释出了供VMWare使用的NVMe驱动程式，vSphere 6.0以及其后的版本中，均包含了该驱动程式，支援多种NVMe装置。在 vSphere 6 update 1 更新中，VMWare的VSAN软体模拟的存储子系统也开始支援NVMe装置。
 Windows
 微软在Windows 8.1和Windows Server 2012 R2开始，原生支援NVMe装置。同时也为Windows 7和Windows Server 2008 R2提供原生驱动程式支援（Windows 7与Windows Server 2008 R2预设不支援NVMe，需由使用者自行下载获取）。
 除了微软官方提供的驱动程式以外，OpenFabrics Alliance也有维护一套开放原始码的NVMe驱动程式，使用于Windows 7、8、8.1、10以及Windows Server 2008 R2、2012、2012 R2，这套驱动程式由数个加入了NVMe工作组的公司开发，包括IDT、英特尔以及LSI。 当前版本为2016年12月发布的1.5。

**参见**
 电脑装置频宽列表- M.2- PCI Express- SATA- SATA Express

**参考资料**

**外部连结**
  NVM Express – scalable, efficient, and industry standarddate=20191205093351 -  LFCS: Preparing Linux for nonvolatile memory devicesdate=20170519075206 , LWN.net, April 19, 2013, by Jonathan Corbet-  Multipathing PCI Express Storage, Linux Foundation, March 12, 2015, by Keith Busch