NVM Express

匯流排界面規範

NVM Express(縮寫NVMe),或稱非揮發性主記憶體主機控制器介面規範(英語:Non-Volatile Memory Host Controller Interface Specification,縮寫:NVMHCIS),是一個邏輯裝置介面規範。它是基於裝置邏輯介面的匯流排傳輸協定規範(相當於通訊協定中的應用層),用於存取通過PCI Express(PCIe)匯流排附加的非揮發性記憶體媒介(例如採用快閃記憶體固態硬碟機),雖然理論上不一定要求PCIe匯流排協定。NVMe是一種協定,是一組允許SSD使用PCIe匯流排的軟硬件標準;而PCIe是實際的物理連接通道。

非揮發性主記憶體主機控制器介面工作群組
簡稱NVMe
成立時間2011年,​13年前​(2011
類型匯流排硬碟機介面[*]
網站nvmexpress.org
PCI Express型、M.2型(下)

NVM代表非揮發性記憶體(non-volatile memory)的首字母縮略字,這是固態硬碟(SSD)的常見的快閃記憶體形式。此規範主要是為基於快閃記憶體的儲存裝置提供一個低延時、內部並行化的原生介面規範,也為現代CPU、電腦平台及相關應用提供原生儲存並行化的支援[1],令主機硬件和軟件可以充分利用固態儲存裝置的並列化儲存能力。相比此前機械硬碟機(HDD)時代的AHCI(SATA下的協定),NVMe/NVMHCI降低了I/O操作等待時間、提升同一時間內的操作數、更大容量的操作隊列等。

依託於PCIe匯流排,NVMe裝置可適用於各種支援PCIe匯流排的物理插槽上,包括標準尺寸的PCIe擴充卡英語Expansion card(一般是4個PCIe通道)[2]、採用U.2物理連接介面(SFF-8639)的2.5英寸/3.5英寸標準尺寸固態硬碟機、[3][4]SATA Express匯流排(相容於PCIe)的裝置、M.2規格擴展卡等。[5]此規範由NVMHCIS工作組負責管理。

背景

歷史上,大多數SSD使用如SATASAS光纖通道等介面與電腦介面的匯流排連接。隨着固態硬碟在大眾市場上的流行,SATA已成為個人電腦中連接SSD的最典型方式;但是,SATA的設計主要是作為機械硬碟機(HDD)的介面,機械結構的HDD使用讀取臂做讀寫,與直接操作固態顆粒的SSD差異很大,並隨着時間的推移越來越難滿足速度日益提高的SSD。[6]隨着在大眾市場的流行,許多固態硬碟的數據速率提升已經放緩。不同於機械硬碟,部分SSD已受到SATA最大吞吐量的限制。

在NVMe出現之前,高階SSD只得以採用PCI Express匯流排製造,但需使用非標準規範的介面。若使用標準化的SSD介面,作業系統只需要一個驅動程式就能使用符合規範的所有SSD。這也意味着每個SSD製造商不必用額外的資源來設計特定介面的驅動程式。[7]

截至2014年9月,在光纖通道(FC)上使用NVMe的新標準也正在開發。[8]

截止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。[9]

2018年,基於NVMe的SSD已經可以突破15TB可用容量,讀頻寬達到6GB/s,100萬IOPS(4KB隨機讀),同時保證微秒級延遲。[10] 產品規格:

  • 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月)[11]
    • 2.0a(2021年7月)
    • 2.0b(2022年1月)
    • 2.0c(2022年10月)

作業系統支援

 
Linux內核的儲存控制堆疊中,NVMe的資料路徑、不同層面下多重內部隊列的位置[12]
9Front
2017年3月30日,NVMe驅動程式釋出並供使用[13]
Chrome OS
2015年2月24日,加入NVMe驅動至內核和開機載入程式,可從NVMe裝置啟動Chrome OS[14][15]
DragonFly BSD
DragonFly 4.6開始內建NVMe驅動程式[16]
FreeBSD
Intel贊助開發的驅動程式已內建於FreeBSD的head、stable/9分支中。[17][18]nvd(4)和nvme(4)驅動程式則是在10.2版FreeBSD中開始預設內建於其中。[19]
Haiku
Haiku已有驅動開發時程,但是目前仍未完成[20]
illumos
illumos於2014年10月15日獲得驅動程式支援[21]
iOS
iOS 9開始支援,首款配備了NVMe介面的裝置是iPhone 6S/6S Plus,也是首款採用NVMe的流動裝置。物理介面和UFS相同的採用M-PHY PCIe。接下來Apple推出的iPad ProiPhone SE也採用了NVMe[22]
Linux
NVMe的驅動程式最早是英特爾提供的,適用於Linux的內核驅動程式模組。[23][24][25]這個模組在2012年3月19日整合到Linux內核的主線驅動程式當中,Linux內核3.3版開始內建支援而無需安裝額外模組。[26]
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裝置[27][28][29]
NetBSD
NetBSD在2016年的開發版本中初步支援NVMe。[30]
OpenBSD
OpenBSD的NVMe驅動程式自2014年6月開始,由此前開發並釋出USBAHCI驅動程式的高級開發團隊負責。[31]OpenBSD 6.0開始正式支援。[32]
OS X/macOS
Mac OS X 10.10.3(OS X Yosemite)開始支援NVMe。蘋果公司的Retina MacBook和2016年發佈MacBook Pro,配備了使用NVMe的PCIe SSD作為主硬碟機使用。[33]
Solaris
Solaris自Oracle Solaris 11.2開始支援NVMe。[34]
VMware
英特爾釋出了供VMWare使用的NVMe驅動程式,[35]vSphere 6.0以及其後的版本中,均包含了該驅動程式,支援多種NVMe裝置。[36]在 vSphere 6 update 1 更新中,VMWare的VSAN軟件模擬的儲存子系統也開始支援NVMe裝置。[37]
Windows
微軟在Windows 8.1Windows Server 2012 R2開始,原生支援NVMe裝置。[38][39]同時也為Windows 7Windows Server 2008 R2提供原生驅動程式支援(Windows 7與Windows Server 2008 R2預設不支援NVMe,需由用戶自行下載獲取)。[40]
除了微軟官方提供的驅動程式以外,OpenFabrics Alliance也有維護一套開放原始碼的NVMe驅動程式,使用於Windows 7、8、8.1、10以及Windows Server 2008 R2、2012、2012 R2,這套驅動程式由數個加入了NVMe工作組的公司開發,包括IDT、英特爾以及LSI[41] 目前版本為2016年12月發佈的1.5。[42]

參見

參考資料

  1. ^ 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. 
  2. ^ Drew Riley. Intel SSD DC P3700 800GB and 1.6TB Review: The Future of Storage. tomshardware.com. 2014-08-13 [2014-11-21]. 
  3. ^ Intel Solid-State Drive DC P3600 Series (PDF). Intel: 18, 20–22. 2015-03-20 [2015-04-11]. (原始內容存檔 (PDF)於2015-04-02). 
  4. ^ Paul Alcorn. SFFWG Renames PCIe SSD SFF-8639 Connector To U.2. Tom's Hardware. 2015-06-05 [2015-06-09]. 
  5. ^ 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). 
  6. ^ Walker, Don H. A Comparison of NVMe and AHCI (PDF). 31 July 2012. SATA-IO. [3 July 2013]. (原始內容存檔 (PDF)於2019-02-12). 
  7. ^ NVM Express Explained (PDF). 9 April 2014 [21 March 2015]. (原始內容存檔 (PDF)於2016-03-04). 
  8. ^ 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). 
  9. ^ NVM Express Announces the Rearchitected NVMe 2.0 Library of Specifications. [2022-12-25]. (原始內容存檔於2023-01-18). 
  10. ^ 王楠. 打造绿色数据中心 Memblaze发布NVMe SSD新品_科技_环球网. tech.huanqiu.com. [2018-11-13]. (原始內容存檔於2018-11-13) (英語). 
  11. ^ NVM Express Announces the Rearchitected NVMe 2.0 Library of Specifications. [2022-12-25]. (原始內容存檔於2023-01-18). 
  12. ^ Werner Fischer; Georg Schönberger. Linux Storage Stack Diagram. Thomas-Krenn.AG. 2015-06-01 [2015-06-08]. (原始內容存檔於2019-06-29). 
  13. ^ hg/plan9front:sys/src/9/pc/sdnvme.c. [2017-08-22]. (原始內容存檔於2017-03-31). 
  14. ^ NVM Express  » ChromeOS adds boot support for NVM Express. nvmexpress.org. [21 March 2015]. (原始內容存檔於2016-04-22). 
  15. ^ 4f503189f7339c667b045ab80a949964ecbaf93e - chromiumos/platform/depthcharge - Git at Google. googlesource.com. [21 March 2015]. (原始內容存檔於2017-08-23). 
  16. ^ DragonFly BSD 4.6. www.dragonflybsd.org. [2016-09-08]. (原始內容存檔於2016-09-04). 
  17. ^ Log of /head/sys/dev/nvme. FreeBSD source tree. The FreeBSD Project. [16 October 2012]. (原始內容存檔於2013-05-29). 
  18. ^ Log of /stable/9/sys/dev/nvme. FreeBSD source tree. The FreeBSD Project. [3 July 2013]. (原始內容存檔於2018-02-16). 
  19. ^ FreeBSD 10.2-RELEASE Release Notes. The FreeBSD Project. [5 August 2015]. (原始內容存檔於2017-06-18). 
  20. ^ #9910 NVMe devices support. dev.haiku-os.org. [2016-07-28]. (原始內容存檔於2016-08-06). 
  21. ^ 4053 Add NVME Driver Support to Illumos. github.com. [2016-05-23]. (原始內容存檔於2017-05-10). 
  22. ^ Ho, Joshua. iPhone 6s and iPhone 6s Plus Preliminary Results. www.anandtech.com. [2016-06-01]. (原始內容存檔於2016-05-26). 
  23. ^ Matthew Wilcox. NVM Express driver. LWN.net. 2011-03-03 [2013-11-05]. (原始內容存檔於2012-07-17). 
  24. ^ Keith Busch. Linux NVMe Driver (PDF). flashmemorysummit.com. 2013-08-12 [2013-11-05]. (原始內容存檔 (PDF)於2013-11-05). 
  25. ^ 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). 
  26. ^ Merge git://git.infradead.org/users/willy/linux-nvme. kernel.org. 2012-01-18 [2013-11-05]. 
  27. ^ Linux kernel 3.18, Section 1.8. Optional multiqueue SCSI support. kernelnewbies.org. 2014-12-07 [2014-12-18]. (原始內容存檔於2014-12-18). 
  28. ^ Linux kernel 4.0, Section 3. Block. kernelnewbies.org. 2015-05-01 [2015-05-02]. (原始內容存檔於2015-05-04). 
  29. ^ Linux Multi-Queue Block IO Queueing Mechanism (blk-mq) - Device Drivers. thomas-krenn.com. 2015-06-08 [2015-06-08]. (原始內容存檔於2016-03-03). 
  30. ^ nvme -- Non-Volatile Memory Host Controller Interface. NetBSD manual pages. 2016-01-01 [2016-09-02]. (原始內容存檔於2016-09-15). 
  31. ^ David Gwynne. non volatile memory express controller (/sys/dev/ic/nvme.c). BSD Cross Reference. 2014-04-16 [2014-04-27]. (原始內容存檔於2014-04-28). 
  32. ^ David Gwynne. man 4 nvme. OpenBSD man page. 2016-04-14 [2016-08-07]. (原始內容存檔於2016-08-21). 
  33. ^ Faster 'NVM Express' SSD Interface Arrives on Retina MacBook and OS X 10.10.3. macrumors.com. [11 April 2015]. (原始內容存檔於2017-08-23). 
  34. ^ nvme(7D). Oracle. [2014-12-02]. (原始內容存檔於2015-12-09). 
  35. ^ Intel Solid-State for NVMe Drivers. intel.com. 2015-09-25 [2016-03-17]. (原始內容存檔於2016-03-25). 
  36. ^ VMware Compatibility Guide for NVMe devices. vmware.com. [2016-03-17]. (原始內容存檔於2016-03-25). 
  37. ^ VSAN Now Supporting NVMe Devices. vmware.com. 2015-11-11 [2016-03-17]. (原始內容存檔於2016-03-25). 
  38. ^ Andy Herron. Advancements in Storage and File Systems in Windows 8.1 (PDF). snia.org. 2013 [2014-01-11]. (原始內容存檔 (PDF)於2014-01-10). 
  39. ^ Windows 8.1 to support hybrid disks and adds native NVMe driver. Myce.com. 2013-09-06 [2014-01-11]. (原始內容存檔於2014-01-10). 
  40. ^ 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). 
  41. ^ Windows NVM Express. Project web site. [September 18, 2013]. (原始內容存檔於2013年6月12日). 
  42. ^ 存档副本. [2017-08-22]. (原始內容存檔於2017-05-10). 

外部連結