NVMe技术分析之数据结构

本文介绍了NVMe存储接口的关键技术和数据结构,包括指令集、队列管理机制、门铃寄存器通信机制以及命名空间的概念。重点分析了NVMe如何通过优化设计提升I/O性能和降低延迟。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

NVMe数据结构

NVMe作为新兴的存储器逻辑接口,制定了主机与SSD设备之间的通信方式,包括指令集、工作机制、SSD控制寄存器等内容。相比于传统的AHCI协议进行了大量改进,使其拥有诸多优势。NVMe提供了显著的I/O性能,并大幅减少了延迟,该设计将存储物理上更靠近CPU,提高了协议效率。本节将对NVMe技术中的关键内容进行分析。

1.0 NVMe特性

NVMe精简了调用方式,使主机在提交和执行指令的过程中都无需对非缓存的寄存器进行访问,而传统的AHCI接口协议在每个命令执行的过程中需读取4次寄存器,即消耗大约8000个时钟周期,使得传输延迟较高。除此之外,AHCI仅能支持1个队列,队列的最大深度为32,而NVMe能够支持的最大队列数量为64K,并且每个队列的最大深度也为64K,使其能够在多CPU的情况下同时运行,保证了足够的带宽,使IOPS性能大增,大幅提升并发程度。
首先将分析NVMe的指令集。NVMe将所支持的指令分为Admin和NVM指令集两种类型。其中,Admin指令主要对SSD控制器进行管理操作,而NVM指令则主要是针对数据实现相关控制。同时,为了简化指令集,NVMe协议规定除了少数如创建(删除)I/O队列、读、写、刷新等必须包括的指令之外,其余均为可选指令。表2.2列举了NVMe指令集中主要包含的Admin指令和NVM指令。
在这里插入图片描述
表2.2中重要的几个指令具体意义如下:
(1)创建I/O提交/完成队列指令
由于I/O提交/完成队列均位于主机端内部,所以需通过发送创建I/O提交/完成队列指令来将队列的相关信息告知SSD控制器,包括队列深度、队列ID号、队列基地址以及队列地址空间是否连续等信息。
(2)识别指令
用于获取NVM子系统、控制器或对应命名空间的相关信息。当SSD获取到主机发送的识别指令后,将返回4KB的数据结构,其中包括SSD的总存储空间、剩余可用空间、逻辑块大小等信息。
(3)读取指令/写入指令
用于写入或读取数据。由于在NVM系统中数据按照逻辑块(Logic Block)为基本单位的方式进行存储,因此执行读写指令时,操控的数据量至少为一个逻辑块,且一条指令仅作用于一个LBA(Logical Block Address,逻辑块地址)范围。
(4)刷新指令
在读写数据的过程中,为了提高效率,部分数据可能缓存在缓冲区中,而不是处于非易失性状态。因此,若出现突然掉电的情况,将导致缓冲区中数据丢失。针对这种问题,可使用刷新指令主动将存储在缓冲区中的数据立即写入非易失性存储介质中。
接下来将讨论NVMe协议的队列管理机制。队列作为协议规范中关键的一个环节,主机与存储设备内部控制器之间将通过队列来建立联系,也就是主机端指令的提交过程和SSD端指令执行完成信息的返回过程均将通过相应队列来实现信息的同步。在NVMe中,将队列的类型分为提交队列和完成队列两类,即主机端的新指令将依次存放至提交队列中,而对应指令的执行情况将依次返回至完成队列中。如图1所示为队列的工作原理示意。
在这里插入图片描述
由图1可知,队列为类似FIFO的环状结构,共有队首和队尾两个指针。当两个指针指向同一位置时,表示当前队列为空;当队列仅剩一个可用空间时,表示队列为满。队列中存储内容的处理过程采用生成-消费规则,并规定队列尾部为生产者,队列头部为消费者。对于提交队列来说,生产者为主机,消费者则为SSD控制器。主机将所产生的提交指令将依次放至队列的尾部,而SSD则将从队列的头部开始读取指令;对于完成队列来说,生产者为SSD,消费者则为主机。SSD将新的完成信息返回至队列尾部,而主机则通过消耗队列头部来表示完成信息检查完成[25]。
提交队列和完成队列之间的对应关系既可为一对一,也可为多对一。通过使用多个提交队列,可满足多线程的性能需求,或是将多个提交队列赋予不同的优先级,实现对有限资源的合理利用。同时,根据本节开始时所述,NVMe协议共有Admin和NVM两种指令集,因此队列也将分为Admin队列和I/O队列两种类型,用于存放对应类型指令。其中Admin队列必须有且只能有一个,而I/O队列则支持最大64K个。
然而,由于Admin队列和I/O队列均位于主机端内部,SSD无法实时获取队列情况,因此主机和SSD之间必定存在信息的不对称问题。为了降低主机和SSD之间总线通信的频率,提高执行效率,NVMe通过一种称为门铃寄存器(Doorbell Register,简称DB)的通信机制来实现队列信息的同步。所有的门铃寄存器均位于SSD控制器内部,主机将队列门铃信息写入门铃寄存器中,SSD控制寄存器通过计算门铃寄存器前后更新的差值,得到队列中待执行的指令数量,从而实现相应队列实时情况的同步。通过采取将队列和门铃寄存器分割的方式,能够减少不必要的总线通信,可有效降低相互之间的访问频率。除此之外,为了简化所需存储的门铃信息,门铃寄存器中将仅存储队列的队首或队尾。图2为门铃管理的工作原理示意。
在这里插入图片描述
由图2可知,当前提交队列的队列队首指向0,而队列队尾指向6,表示队列此时有6条新的提交指令等待执行。则主机控制器将对应门铃寄存器所存储的数值从0更新为6。之后,SSD通过计算前后差值得到指令数量,并通过总线访问读取指令直至队列的队首和队尾指针相同,以此表示当前队列无待执行的新指令。
最后将对NVMe协议中的命名空间(Namespace,NS)概念进行分析。命名空间是由一定量的逻辑块组成的NVM,一个控制器支持同时存在多个由不同ID号标识的NS区域,类似操作系统的磁盘分区操作。通过分配独立的NS,使不同的控制器能够并行访问对应的NS,提高运行效率,或是根据不同需求创建不同特征的NS。如图3所示为命名空间示意。
在这里插入图片描述

2.0 NVMe数据结构

如上所述,NVMe协议中指令分为Admin指令和NVM指令两种类型。两种指令的数据结构相似,其中,每个NVMe指令的长度固定为64字节,对应的完成信息长度固定为16字节,且均是按对齐的。表2所示为NVMe协议规范的指令数据结构。
在这里插入图片描述
NVMe提交指令数据结构中主要包括表示操作码、命令ID号以及数据指针选择位等内容的第一个双字段DW0、表示命名空间标识的双字段DW1、表示数据指针的双字段DW6-DW9以及根据具体指令所变化的其余双字段。表3所示为完成信息的数据结构。
在这里插入图片描述
可以看出,不同的完成信息其数据结构除了第一个双字段DW0需根据具体命令进行自定义之外,其余部分内容基本类似。并且,主要通过DW3中的状态域SF来检查该完成信息所对应的指令执行情况。提交指令和完成信息数据结构具体的含义以及组装过程将后面详细论述。
指令数据结构中的数据指针域主要用来记录所需操作的数据在主机端内存中物理页的地址。在向SSD写入数据时,主机首先发出Write指令,随后SSD控制器解析指令中的数据指针部分,得到相关数据在主机内存中的存放地址,并读取到写数据所对应的目的逻辑块地址LBA;在读取SSD时,主机发出Read命令,读取到的数据将通过PCIe总线接口传输到SSD控制器所解析出来的主机内存中指定的存放地址。在NVMe协议中有PRP(Physical Region Page)和SGL(Scatter/Gather List)两种寻址模型。两者均可用来描述Host内存物理空间的方式,区别在于PRP必须是物理页对齐的,而SGL则可以表述任意的物理空间。除此之外,Admin队列中的指令只能使用PRP数据指针,而无法使用SGL。因此PRP是必须实现的基本模型,SGL则更多是用于NVMe Over Fabric中,所以本课题设计将使用PRP寻址模型。如图4所示为内存页大小为4KB时对应的PRP数据结构。PRP Entry的本质是64位的指针,用于指向主机内存物理地址。64位的地址被划分为页起始地址和页内偏移地址两个部分,并且最低的两个bit位固定为0以表示PRP的物理地址只能是四字节对齐。
在这里插入图片描述
由于常见的内存页大小为4KB,当所需传输的数据大于一个4KB时,需要通过多个PRP形成链表来实现完成数据的传输,即同时使用PRP1和PRP2来描述地址信息。此时的PRP既可指向数据所在的物理页,也可指向PRP链表。如图5所示为传输16KB数据所需使用到的PRP链表描述原理。
在这里插入图片描述
如图5所示,由于传输16KB数据至少需要4个PRP,所以需要用到PRP链表。PRP1直接指向第一个4KB内存页,并且数据的实际物理地址基于页偏移地址计算获得,而PRP2则指向PRP链表首地址。PRP链表中则存放剩余PRP Entry,首先需获取PRP,再通过具体的PRP依次指向数据的物理地址。

NVMe host IP 效果见 视频demo (B站 搜 NVMe IP):
https://search.bilibili.com/all?keyword=nvme%20ip&from_source=nav_search_new
qq:1943086312

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值