深入了解NVMe技术及其应用场景

NVME介绍

本篇内容使用于介绍NVME 是什么、通信结构,接口类型、性能评定、NVME 协议通信原理,NVME代码解读等部分。

(一) 首先NVME是什么呢?

NVME是一种被用于host software与非易失性内存的子系统通信的寄存器级别的接口。

主要为企业、数据中心以及客户端系统中应用PCIe接口的固态存储设备(SSD)设计,它的目标是最大限度的释放闪存的潜能。

(二) 通信结构

image-20220628192956438

图-1

图中展示NVME在数据传输过程中的位置,有一部分位于PCIE之上,这部分也是NVME驱动的主要部分,还有一部分位于用户态的软件层,用于应用层在NVME驱动间的交互。

(三) 接口类型

image-20220628201329081

图-2

B key: 接口的固态硬盘,走SATA通道和PCI-EX2

M key: 接口的高端固态硬盘,走PCI-Ex4通道

B&M key接口的固态硬盘,走PCI-Ex2或者SATA;

想要查看自己电脑是什么接口可以通过CrystalDiskInfo工具查看;我电脑上的就是M key;

image-20220628202235140

图-3

(四) 性能评定

一块NVME硬盘的性能好坏决定在日常电脑使用过程的中体验感,以及系统的稳定性。

评价一块硬盘的性能通常有两种方式,方式一:单位时间内数据吞吐量(MB/s);方式二:单位时间内I/O读写请求数量;

这两种方式有什么区别?

第一种:主要用于磁盘顺序读写大量数据时,评定磁盘的性能;

第二种:主要用于系统进程随机读写小批量数据时,评定磁盘的性能;

image-20220628202958870

图-4

image-20220628204020062

图-5

从图-4可以看出顺序读写分别为2860M/s, 以及2674M/s相比SATA3.0协议理论值600M/s,提速4倍之多。

(五) NVME 理论

名词定义:

Description Acronyms
Scatter Gather List SGL
Controller Configuration CC
Controller Status CSTS
Physical Region Page PRP
Admin Queue Attributes AQA
Admin Submission Queue Base Address ASQ
Admin Completion Queue Base Address ACQ
Submission Queue y Tail Doorbell SQyTDBL
Completion Queue y Head Doorbell CQyHDBL
Admin Command
I/O Command
Submission Queues SQ
Completion Queues CQ
Logical block address LBA
NameSpace NS
NameSpace ID NSID
Controller Capabilities CAP

NVME接口主要属性:

  • 在命令提交或者完成的路径上不需要读取相关寄存器;
  • 支持最多65535的I/O队列,每个队列支持64K的未处理命令;
  • 每个队列的优先级拥有明确的仲裁机制;
  • 为确保高效的IO操作,完成一个4KB读取请求需要的所有信息包含在64B的命令中;
  • 高效且流线型的指令集;
  • 支持MSI/MSI-X中断和中断聚合;
  • 支持多个命名空间;
  • 支持虚拟化架构,SR-IOV;
  • 健全的错误报告机制以及功能管理;
  • 支持多路径IO和命名空间共享
  • NVME Controller Registers:

    此寄存器主要描述Controller 相关功能和性能配置。包括控制器的初始化或者复位,AQA命令配置,以及SQyTDBL配置等。

    Host通过PCI BAR0 和 BAR1将Controller Registers 映射到内存空间中。

    host访问寄存器空间应按照原始宽度或者32为对齐访问。

    Memory Structures:

    描述在host Memory中的内存结构,如果Controller Memory Buffer 是被支持的话,内存结构是支持在控制器的Memory中。

    Submission Queue & Completion Queue

    Head和Tail entry Pointers 分别对应Completion Queue Head DooBells 和 Submission Queue Tail Doorbells。Doorbell寄存器通过HostSoftware

    更新;

    在Submission Queue有新entry加入,Tail Entry Pointer应该加一;同理Completion

    对于Submission Queue tail, host是Producer,Submission Queue head, Controller是Consumer;

    对于CQ tail, host是Consumer,CQ head, Controller是Producer;

    Empty Queue: 当Head entry pointer 等于 Tail entry pointer。

    image-20220629191410711

    图-8

    Full Queue:当Head entry pointer 加1等于Tail entry pointer。

    image-20220629191759321

    图-9

    Submission Queue Entry – Command Format

    命令大小为64 bytes;

    命令由Command Dword 0, Namespace Identifier,Metadata Pointer, PRP Entry 1, and PRP Entry 2,SGL Entry1 and Metadata SGL等。

    命令格式主要的三种有Admin Command ,NVM Command , Admin and NVM Vendor Specific Command。具体格式差异请参考Spec。

    Command Dword 0 中opcode是所有格式中必要的一部分;Opcode定义了格式中相关子功能标识。例如-图-10

    image-20220629200346156

    图-10

    Completion Queue Entry

    Completion Queue是16字节的大小;

    命令格式:DW0; DW1; DW2; DW3组成;如图-11

    image-20220630161034095

    其中DW0为通用Command格式;参考SQEntry DW0

    需要注意的是,host提交了Submission Queue Tail 之后,而SQ Head由Controller产生,host并不能知道head指向的位置,就需要由CQEntry 提供当前SQ Head状况。

    Phase Tag§命令,代表SQTail已经被执行,Controller产生新的CQEntry命令到队列中,此时该标识会翻转。

    PRP

    PRP是一片指向物理内存页,被用来Controller和host Memory传输数据。而PRP的大小是由host Memory Page来决定的,对应CC.MPS。

    image-20220629193416117

    图-11

    如图-11,PRP Entry 由两部分组成,一部分为Page Base Address,另一部分为 Offset。

    其中offset+2 应该等于Host Memory page大小。

    Controller Memory Buffer

    主要用来提升硬盘性能的,常用通信方式是通过将提Queue 命令存放到host Memory 中,host 和 Controller Regerster 通过SQ 和 CQ方式来传递数据;如果NVME支持Controller Memory Buffer,可以将数据放到Controller memory ,通过Controller Memory 与 Host Memory 直接传输数据,提升速度。

    Admin Command Set

    Admin Command 用来定义和描述提交到提交队列的命令。例如,Create I/O Submission Queue, Create I/O Completion Queue, Identify等。

    其中关于 Identify Command 需要重点关注一下。命令用于返回一个描述关于NVM SubSystem,Controller, Namespace信息。返回的数据是4K的大小。

    数据结构内容其一是 Controller Data Structure,里面定义了关于控制器的VID号,SN,MN,Controller ID等。

    数据结构内容其二是 Namespace Data Structure, 里面定义关于NS区域的NS Size, NS Cap,NSID 等。

    NVM Command Set

    NVM Command 用于对logical Block区域进行操作,包括读写,以及擦除等等。

    logical data 大小,是用byte表示的。logical支持512Bytes,1KB,2KB,4KB,等等。

    在Create IO Submission Queue 和 IO Completion Queue之后,以及CSTS.RDY生效之后,命令才能被host提交。

    Namespace

    一个NVM Subsystem 是有不定数量的Controller,每个控制器下面有不定数量的NameSpace,每个NameSpace由不定数量的logical Block组成。如图-6所示或者图-7。

    每一个NameSpace都有一个唯一的NSID值。

    NS Size 定义在NameSpace data Struct中,其中NameSpace Size >= Namespcae Capacity >= Namespace Utilization。

    image-20220629170025282

    图-6

    image-20220629171222481

    图-7 控制器0只能访问NS A,但不能访问NS C。但NS B控制器0和控制器1都能访问。

    Command Submission and Completion Processing

    关于SQ和CQ命令处理,参考图-12

    image-20220630160634320

    图-12

    解析:

    1. host创建SQEntry Command 到内存中;
    2. host更新SQ Tail Doorbell寄存器,通知Control来处理新命令;
    3. Control从Memory获取SQ command ;
    4. Control将命令放入可执行列表中,可能不按照顺序执行;
    5. 在命令被Control执行后,控制器写Completion Queue Entry 到 CQ中;表示最近SQ Entry被获取;
    6. 控制器产生一个Interrupt给host表示这有一个CQ Entry需要处理;
    7. host处理CQ Entry命令;
    8. host向CQ head Doorbell Register写值,表示CQ Entry已经被处理;

    (六)代码讲解

    参考MdemodulePkg/bus/pci/NvmExpressDxe模块。

    (七)参考文档

    参考文档:(NVM_Express_1_2_Gold_20141209)NVMe Base Specification – NVM Express

    物联沃分享整理
    物联沃-IOTWORD物联网 » 深入了解NVMe技术及其应用场景

    发表评论