NVMHCI

**NVM Express**（縮寫 **NVMe**），或稱**非揮發性記憶體主機控制器介面規範**（英語：**N**on-**V**olatile **M**emory **H**ost **C**ontroller **I**nterface **S**pecification，縮寫：**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 擴充卡（一般是 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 形成一個從盤到儲存系統的端到端生態。

## 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 在閒置時可以非常快速的控制在極低的水平，在功耗管理上 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 則是在其 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