NVMe(Non-Volatile Memory Express)是一种定义主机(Host)与NVMe SSD之间通信的协议。它工作在PCIe的应用层之上,从PCIe协议的视角看,所有的NVMe命令都承载在其数据载荷(Data Payload)中。

与传统的SATA SSD相比,NVMe SSD能够提供更高的吞吐量、更低的访问延迟以及更优的功耗表现,因此已被广泛应用于高性能计算、数据中心和各种存储系统。
那么,主机与NVMe设备之间是如何高效协同工作的呢?其核心在于Queue Pair(队列对) 和Doorbell(门铃) 机制:
- 提交队列 (Submission Queue, SQ):主机将需要执行的命令放入此队列。
- 完成队列 (Completion Queue, CQ):SSD控制器从SQ中取出命令并执行完毕后,会将命令完成的状态信息写入此队列。
- 门铃寄存器 (Doorbell Register, DB):主机向SQ写入命令后,通过写入这个寄存器(如同按响门铃)来通知SSD:“有新命令待处理”。
SQ和CQ通常位于主机侧的内存中,而DB则位于NVMe控制器内部的PCIe BAR地址空间内。如下图所示,一个完整的NVMe子系统作为PCIe Endpoint,包含了控制器、非易失性存储介质(如闪存)以及PCIe接口。

NVMe协议根据命令的用途,将队列分为两类:
- 管理队列 (Admin Queue):用于传输管理命令,例如获取SSD属性、创建或删除I/O队列等。
- I/O队列:用于传输实际的数据读写等I/O命令。
在一个系统中,有且仅有一对管理SQ/CQ,但可以配置多对I/O SQ/CQ。管理队列仅用于管理命令交互,I/O队列仅用于I/O命令交互。此外,每个主机核心(Core)可以拥有多个I/O SQ,但通常共享一个I/O CQ,形成多对一的关系。

NVMe协议规范支持巨大的队列规模——最多可达64K个I/O队列(外加1个管理队列),且每个队列的深度也可高达64K。在实际的硬件与系统设计中,队列的数量和深度可以根据项目需求和资源情况进行灵活配置。
SQ和CQ在内存中采用环形队列(Ring Buffer)结构。对于SQ,主机是生产者(写入命令),NVMe控制器是消费者(读取命令);对于CQ,角色则相反。因此,SQ的尾指针(Tail)和CQ的头指针(Head)由主机更新,而SQ的头指针(Head)和CQ的尾指针(Tail)由NVMe控制器更新。

在实际使用中,通过Head和Tail指针标记队列的首尾。当Head与Tail指向同一位置时,表示队列为空。NVMe协议规定,当Head指针比Tail指针领先一个位置时,即判定队列为满。这意味着队列中始终会有一个条目(Entry)是空置的,这种设计简化了满状态的判断逻辑,是内存管理中常见的技巧。
Host与NVMe设备交互流程
理解了核心组件,我们来看看一次完整的I/O命令是如何在主机和SSD之间流转的。
SQ位于主机内存中。当主机需要发送命令时,首先将格式化好的命令(每条命令Entry固定为64字节)写入SQ,然后通过PCIe写操作更新SSD控制器端的SQ Tail Doorbell寄存器,以此通知SSD有新命令到达。同样,CQ也位于主机内存。无论命令执行成功与否,SSD控制器在执行完毕后,总会向CQ写入一个完成状态条目(每个Entry为16字节)。

上图清晰地展示了一次NVMe命令处理的完整八步流程:
- 主机写命令:主机将一个或多个命令写入SQ的可用Entry中。
- 主机通知:主机更新SQ Tail Doorbell寄存器,告知NVMe控制器有新的命令待取。
- 控制器取命令:控制器收到Doorbell通知后,通过PCIe读操作从主机内存的SQ中获取命令。
- 控制器执行命令:控制器在内部执行该命令(如读写闪存介质)。
- 写完成状态:命令执行完毕后,控制器将完成状态写入主机内存的CQ中,并标识出刚才处理的是SQ中的哪个Entry。
- 发起中断:控制器触发一个MSI-X中断,通知主机命令已执行完成。
- 主机处理完成:主机的中断服务程序响应中断,从CQ中读取Completion Entry并进行相应处理。
- 释放完成项:主机更新CQ Head Doorbell寄存器,告知控制器该CQ Entry已被处理,可以释放。
这套基于队列和门铃的异步通信机制,极大地减少了中断频率和CPU参与度,从而充分释放了PCIe高速通道的潜力,这是NVMe能够实现超高性能的关键所在。希望这篇解析能帮助你更深入地理解NVMe的工作机理。如果你想就存储技术或其它底层系统进行更多交流,欢迎来云栈社区一起探讨。
参考文档:
- NVMe over PCIe Transport Specification, Revision 1.0c
- https://zhuanlan.zhihu.com/p/1921890738624496482
- https://zhuanlan.zhihu.com/p/347599423
|