1 NVMe协议基础Non-Volatile Memory ExpressNVMe是一种专门为非易失性存储设备设计的高性能存储协议其通过PCI ExpressPCIe总线与主机系统连接并采用轻量级命令集与高度并行的队列模型使存储设备能够充分发挥闪存和新型非易失性存储器的性能优势。与传统存储协议相比NVMe在命令处理路径、队列管理以及并行访问机制等方面进行了优化使系统能够在低延迟、高带宽环境下高效访问存储设备。NVMe协议的设计目标是最大限度地减少软件协议开销并提高系统并行能力。在传统存储协议中单一命令队列和复杂的中断处理机制往往成为系统性能瓶颈。而 NVMe通过引入多队列架构以及简化的寄存器接口使主机与存储控制器之间能够高效地交换命令和数据。此外NVMe协议还针对现代多核处理器系统进行了优化使不同CPU核心能够独立访问不同队列从而显著提升系统整体吞吐能力。1.1 NVMe 协议架构NVMe协议采用主机控制器与存储设备之间的队列式通信架构。在该架构中主机通过NVMe控制器NVMe Controller向存储设备发送命令存储设备在执行命令后返回完成信息。NVMe协议将控制器内部功能划分为多个模块包括命令处理模块、数据传输模块以及队列管理模块等从而实现高效的数据访问。在系统结构上NVMe设备通常通过PCIe接口与主机系统连接。PCIe提供了高带宽、低延迟的数据传输通道使NVMe设备能够充分发挥固态存储的性能优势。主机系统通过NVMe驱动程序与控制器进行通信并通过内存映射寄存器Memory Mapped I/OMMIO访问NVMe控制器的寄存器空间。NVMe协议中的命令分为两类管理命令Admin Command和I/O命令I/O Command。管理命令用于设备初始化和配置例如Identify、Get Features和Set Features等操作I/O命令则用于实际的数据读写操作例如NVMe Read和NVMe Write。NVMe控制器通过不同的队列来处理这两类命令其中管理命令通过Admin Queue处理而数据读写命令则通过多个I/O Queue处理。此外NVMe协议采用基于内存的数据交换方式。主机在系统内存中创建命令队列并通过寄存器将队列地址和大小告知NVMe控制器。控制器在执行命令时直接访问主机内存中的队列从而减少了额外的数据复制和协议处理开销。这种基于共享内存的通信方式使NVMe协议能够实现高效的命令交换机制。1.2 Submission Queue与Completion QueueNVMe协议的核心通信机制是基于队列的命令处理模型。每个NVMe队列由两个部分组成Submission QueueSQ和Completion QueueCQ。SQ用于主机向控制器提交命令而CQ用于控制器向主机返回命令执行结果。Submission Queue是一个环形队列结构如图1所示存储NVMe命令描述符Submission Queue EntrySQE。每个SQE通常为64字节其中包含命令类型、命名空间标识符、数据地址以及数据长度等信息。当主机需要执行存储操作时会在SQ中写入一个新的SQE并通过更新队列尾指针通知控制器有新的命令需要处理。Completion Queue用于存储命令执行完成后的结果信息。每个完成条目Completion Queue EntryCQE通常为16字节其中包含命令标识符CID、执行状态以及命令执行结果等信息。当NVMe控制器完成一个命令后会在对应的CQ中写入CQE并通过中断或轮询机制通知主机命令已经完成。图1 SQ和CQ队列结构SQ和CQ之间通常通过命令标识符CID进行关联。主机在提交命令时为每个命令分配一个唯一的CID当控制器完成命令后会在CQE中返回该CID从而使主机能够确定对应命令的执行状态。这种基于队列的通信机制具有较高的并行度。主机可以在SQ中连续提交多个命令而无需等待前一个命令执行完成。控制器则可以按照内部调度策略并行处理多个命令从而显著提高存储设备的吞吐能力。B站已给出之前的相关性能演示视频如想进一步了解请搜索B站用户专注与守望https://www.bilibili.com/video/BV1f6mbBeEiH/?spm_id_from333.337.search-card.all.clickvd_sourcec355545d27a44fe96188b7caefeda6e7