NVM Express

NVM Express（缩写NVMe），或称非易失性内存主机控制器接口规范（英語：Non-Volatile Memory Host Controller Interface Specification，缩写：NVMHCIS），是一个逻辑设备接口规范。它是基於裝置邏輯接口的匯流排傳輸協定規範（相當於通讯协议中的应用层），用于访问通过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扩展卡（英语：Expansion card）（一般是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出现之前，高端SSD只得以采用PCI Express总线制造，但需使用非标准规范的接口。若使用标准化的SSD接口，操作系统只需要一个驱动程序就能使用符合规范的所有SSD。这也意味着每个SSD制造商不必用额外的资源来设计特定接口的驱动程序。 截至2014年9月，在光纤通道（FC）上使用NVMe的新标准也正在开发。 截止2018年，NVMe包含NVMe、NVMe-MI以及NVMe-oF（NVMe over Fabrics）三个细分协议，其中NVMe为主协议，规范了host对盘的读写、访问以及资源管理等功能，NVMe-MI主要包括带外管理相关的功能，NVMe-oF主要是基于NVMe的网络协议规范，可以将FC等网络协议与NVMe进行结合起来。同时，并且三个协议在协同演进，未来将会围绕NVMe形成一个从盘到存储系统的端到端生态。 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在闲置时可以非常快速的控制在极低的水平，在功耗管理上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单队列访问存储设备的机制有所不同。 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 Compare: NVM Express. NVM Express, Inc. [2017-01-24]. （原始内容存档于2017-02-07）. NVMe™ is designed from the ground up to deliver high bandwidth and low latency storage access for current and future NVM technologies.  Drew Riley. Intel SSD DC P3700 800GB and 1.6TB Review: The Future of Storage. tomshardware.com. 2014-08-13 [2014-11-21].  Intel Solid-State Drive DC P3600 Series (PDF). Intel: 18, 20–22. 2015-03-20 [2015-04-11]. （原始内容存档 (PDF)于2015-04-02）.  Paul Alcorn. SFFWG Renames PCIe SSD SFF-8639 Connector To U.2. Tom's Hardware. 2015-06-05 [2015-06-09].  Dave Landsman. AHCI and NVMe as Interfaces for SATA Express Devices – Overview (PDF). SATA-IO. 2013-08-09 [2013-10-02]. （原始内容存档 (PDF)于2013-10-05）.  Walker, Don H. A Comparison of NVMe and AHCI (PDF). 31 July 2012. SATA-IO. [3 July 2013]. （原始内容存档 (PDF)于2019-02-12）.  NVM Express Explained (PDF). 9 April 2014 [21 March 2015]. （原始内容存档 (PDF)于2016-03-04）.  Fibre Channel Industry Association Collaborating with NVM Express, Inc. to Define New Standard for Fabric-Based Solid-State Storage Devices (新闻稿). [2017-11-09]. （原始内容存档于2017-07-02）.  NVM Express Announces the Rearchitected NVMe 2.0 Library of Specifications. [2022-12-25]. （原始内容存档于2023-01-18）.  王楠. 打造绿色数据中心 Memblaze发布NVMe SSD新品_科技_环球网. tech.huanqiu.com. [2018-11-13]. （原始内容存档于2018-11-13） （英语）.  NVM Express Announces the Rearchitected NVMe 2.0 Library of Specifications. [2022-12-25]. （原始内容存档于2023-01-18）.  Werner Fischer; Georg Schönberger. Linux Storage Stack Diagram. Thomas-Krenn.AG. 2015-06-01 [2015-06-08]. （原始内容存档于2019-06-29）.  hg/plan9front:sys/src/9/pc/sdnvme.c. [2017-08-22]. （原始内容存档于2017-03-31）.  NVM Express  » ChromeOS adds boot support for NVM Express. nvmexpress.org. [21 March 2015]. （原始内容存档于2016-04-22）.  4f503189f7339c667b045ab80a949964ecbaf93e - chromiumos/platform/depthcharge - Git at Google. googlesource.com. [21 March 2015]. （原始内容存档于2017-08-23）.  DragonFly BSD 4.6. www.dragonflybsd.org. [2016-09-08]. （原始内容存档于2016-09-04）.  Log of /head/sys/dev/nvme. FreeBSD source tree. The FreeBSD Project. [16 October 2012]. （原始内容存档于2013-05-29）.  Log of /stable/9/sys/dev/nvme. FreeBSD source tree. The FreeBSD Project. [3 July 2013]. （原始内容存档于2018-02-16）.  FreeBSD 10.2-RELEASE Release Notes. The FreeBSD Project. [5 August 2015]. （原始内容存档于2017-06-18）.  #9910 NVMe devices support. dev.haiku-os.org. [2016-07-28]. （原始内容存档于2016-08-06）.  4053 Add NVME Driver Support to Illumos. github.com. [2016-05-23]. （原始内容存档于2017-05-10）.  Ho, Joshua. iPhone 6s and iPhone 6s Plus Preliminary Results. www.anandtech.com. [2016-06-01]. （原始内容存档于2016-05-26）.  Matthew Wilcox. NVM Express driver. LWN.net. 2011-03-03 [2013-11-05]. （原始内容存档于2012-07-17）.  Keith Busch. Linux NVMe Driver (PDF). flashmemorysummit.com. 2013-08-12 [2013-11-05]. （原始内容存档 (PDF)于2013-11-05）.  IDF13 Hands-on Lab: Compiling the NVM Express Linux Open Source Driver and SSD Linux Benchmarks and Optimizations (PDF). activeevents.com. 2013 [2014-01-11]. （原始内容 (PDF)存档于2014-01-11）.  Merge git://git.infradead.org/users/willy/linux-nvme. kernel.org. 2012-01-18 [2013-11-05].  Linux kernel 3.18, Section 1.8. Optional multiqueue SCSI support. kernelnewbies.org. 2014-12-07 [2014-12-18]. （原始内容存档于2014-12-18）.  Linux kernel 4.0, Section 3. Block. kernelnewbies.org. 2015-05-01 [2015-05-02]. （原始内容存档于2015-05-04）.  Linux Multi-Queue Block IO Queueing Mechanism (blk-mq) - Device Drivers. thomas-krenn.com. 2015-06-08 [2015-06-08]. （原始内容存档于2016-03-03）.  nvme -- Non-Volatile Memory Host Controller Interface. NetBSD manual pages. 2016-01-01 [2016-09-02]. （原始内容存档于2016-09-15）.  David Gwynne. non volatile memory express controller (/sys/dev/ic/nvme.c). BSD Cross Reference. 2014-04-16 [2014-04-27]. （原始内容存档于2014-04-28）.  David Gwynne. man 4 nvme. OpenBSD man page. 2016-04-14 [2016-08-07]. （原始内容存档于2016-08-21）.  Faster 'NVM Express' SSD Interface Arrives on Retina MacBook and OS X 10.10.3. macrumors.com. [11 April 2015]. （原始内容存档于2017-08-23）.  nvme(7D). Oracle. [2014-12-02]. （原始内容存档于2015-12-09）.  Intel Solid-State for NVMe Drivers. intel.com. 2015-09-25 [2016-03-17]. （原始内容存档于2016-03-25）.  VMware Compatibility Guide for NVMe devices. vmware.com. [2016-03-17]. （原始内容存档于2016-03-25）.  VSAN Now Supporting NVMe Devices. vmware.com. 2015-11-11 [2016-03-17]. （原始内容存档于2016-03-25）.  Andy Herron. Advancements in Storage and File Systems in Windows 8.1 (PDF). snia.org. 2013 [2014-01-11]. （原始内容存档 (PDF)于2014-01-10）.  Windows 8.1 to support hybrid disks and adds native NVMe driver. Myce.com. 2013-09-06 [2014-01-11]. （原始内容存档于2014-01-10）.  Update to support NVM Express by using native drivers in Windows 7 or Windows Server 2008 R2. Microsoft. 2014-11-13 [2014-11-17]. （原始内容存档于2014-11-29）.  Windows NVM Express. Project web site. [September 18, 2013]. （原始内容存档于2013年6月12日）.  存档副本. [2017-08-22]. （原始内容存档于2017-05-10）.  维基共享资源上的相关多媒体资源：NVM 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