扫码加入

  • 正文
  • 相关推荐
申请入驻 产业图谱

NVMe协议及NVMe设备工作流程介绍

01/26 10:09
316
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

1. NVMe协议介绍

NVMe是一种主机(Host)与NVMe SSD之间通信的协议,它是PCIe应用层上的协议,所有的NVMe命令在PCIe协议来看都是Data Payload。

NVMe SSD比SATA SSD具有更高的吞吐量、更快的访问速度和更低的功耗,NVMe SSD目前已被广泛应用于各种计算领域和存储系统

NVMe设备与主机是通过Queue Pair(SQ和CQ)和Doorbell机制来进行命令和数据的交互:

Submission Queue(SQ) :主机把命令放在该队列;

Completion Queue(CQ):SSD从SQ中取出命令并执行完成后,把完成信息写入该队列,指示命令完成状态;

Doorbell Register(DB):主机写完SQ后,再写Doorbell寄存器(Doorbell即门铃,作为一种通知),通知SSD从SQ中取命令。

SQ和CQ通常是在主机侧内存中,DB是位于NVMe控制器内部的BAR空间内,如下图所示。NVMe子系统作为PCIe Endpoint,包含了NVMe控制器、非挥发性存储介质、PCIe接口。


NVMe协议根据命令类型将队列分为Admin队列和I/O队列。

    Admin队列用来缓存Admin管理命令,如获取SSD属性、创建I/O队列等。I/O队列用来缓存I/O命令,如读、写、识别等。

在一个系统中,只能有一对Admin SQ/CQ,但可以存在多对IO SQ/CQ。Admin SQ/CQ仅用来进行Admin命令的交互,I/O SQ/CQ仅用来进行I/O命令的交互。每个core内只有1个I/O CQ,但是可以存在多个I/O SQ,即I/O SQ和I/O CQ可以是多对一的关系。

NVMe协议规定的最大队列数量可以是64K(65535个I/O队列和1个Admin队列),每个队列的深度可以高达64K。在实际设计中,SQ/CQ的个数和深度的设置可以根据项目需求和硬件资源进行配置。

SQ和CQ采用环形队列结构,队列可以映射到任何PCIe可访问的内存中,通常放在主机侧内存。对于SQ,主机端是生产者,NVMe SSD是消费者。CQ则刚好相反。因此,SQ Tail指针和CQ Head指针由主机更新,而SQ Head指针和CQ Tail指针由NVMe控制器更新。NVMe的队列结构如下图。

在实际使用中,通过Tail和Head分别指向队列的首尾位置,队列实际可用的大小是队列大小减1。当Head指针等于Tail指针时,队列为空。判断队列满可以有多种方法,NVMe协议规定当Head指针比Tail指针多一个时,队列为满。所以队列满时,实际会空余一个entry。

2. Host与NVMe设备交互流程

SQ位于内存中,Host要发送命令时,先把准备好的命令写入SQ(每个命令entry是64字节),然后写SSD端的DB寄存器(即SQ tail指针寄存器)来通知SSD有新的命令可以执行。此外,CQ也是位于Host内存中,一个命令执行完成,成功或失败,SSD总会往CQ中写入命令完成状态(每个entry是16字节)。

上图展示了NVMe一次完整处理指令的流程,一共有八步:

1. Host写命令(1条或者多条)到SQ中。

2. Host更新SQ的Tail Doorbell寄存器,通知SSD取命令。

3. SSD收到通知,从SQ中取出命令。

4. SSD执行命令。

5. 命令执行完成后,SSD往CQ中写入命令执行结果。

6. SSD以MSI-X中断的方式通知Host命令已经执行完成。

7. Host响应中断,从CQ中读取CQ entry(CQE)并进行处理。

8. Host更新CQ的Head Doorbell寄存器,来释放CQ entry。

 

参考:

NVMe over PCIe Transport Specification, Revision 1.0c

https://zhuanlan.zhihu.com/p/1921890738624496482

https://zhuanlan.zhihu.com/p/347599423

相关推荐