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