NVM Express

NVM Express（缩写NVMe），或称非易失性内存主机控制器接口规范（，缩写：），是一个逻辑设备接口规范。它是基於裝置邏輯接口的匯流排傳輸協定規範（相當於通讯协议中的应用层），用于-{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月）

作業系統支援 

 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

 Linux
 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則是在其6.0版時釋出了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 standard
 LFCS: Preparing Linux for nonvolatile memory devices, LWN.net, April 19, 2013, by Jonathan Corbet
 Multipathing PCI Express Storage, Linux Foundation, March 12, 2015, by Keith Busch

计算机存储总线
固态计算机存储
计算机硬件标准