01
-
最大化并行 IO 处理能力,避免单队列的命令阻塞。
-
减少 CPU 与控制器的交互开销,降低中断延迟。
-
支持差异化 IO 需求(如优先级、QoS),适配多场景应用。
02
-
Submission Queue(SQ,提交队列):由主机创建和管理,本质是环形缓冲区,用于存储主机待发送的 IO 命令(读、写、管理类命令等)。
-
Completion Queue(CQ,完成队列):由控制器创建和管理,同样是环形缓冲区,用于反馈命令执行结果(状态码、数据长度、错误信息等)。
-
配对关系:1 个 CQ 可绑定多个 SQ(最多 64 个),1 个 SQ 仅能绑定 1 个 CQ,确保结果反馈精准对应。
-
队列标识:每个 SQ/CQ 有唯一 ID(0~65535),控制器通过 ID 识别队列归属。
-
内存布局:队列缓冲区需分配物理连续内存(或通过 SCatter-Gather 支持离散内存),由主机告知控制器地址,确保快速访问。
03
-
队列数量:NVMe 1.0 及以上规范支持最大 64K 个 SQ 和 64K 个 CQ,远超 SATA 的 1 个队列,满足多进程、多线程并行 IO 需求。
-
队列深度:每个队列可容纳的最大命令数,默认支持 64K(65536),远高于 SATA 的 32/64,减少命令频繁提交的开销。
-
中断向量:每个 CQ 可绑定独立的 MSI-X 中断向量,支持最多 2048 个中断向量,避免单中断瓶颈。
04
-
队列创建:主机通过 “Create IO Submission Queue” 和 “Create IO Completion Queue” 命令,向控制器注册 SQ/CQ,明确队列 ID、深度、内存地址、中断向量等参数。 -
命令提交:主机将 IO 命令封装为 NVMe 标准格式(包含操作码、LBA 地址、数据长度、PRP 指针等),写入 SQ 的环形缓冲区,通过 “SQ Tail Doorbell” 寄存器通知控制器。 -
命令执行:控制器检测到门铃信号后,读取 SQ 中的命令,按调度策略(如优先级、权重)排序,执行闪存 IO 操作。 -
结果反馈:控制器完成命令后,将结果(完成状态字、命令标识符等)写入绑定的 CQ,更新 “CQ Head Doorbell”,触发中断通知主机。 -
主机处理:主机响应中断,读取 CQ 中的完成信息,释放命令资源,继续提交新命令,形成闭环。
05
-
优先级调度:基于 SQ 的优先级等级(0~15),高优先级队列(如系统关键 IO)优先执行,保障核心业务响应速度。
-
权重调度:为不同 SQ 分配权重,按比例分配控制器资源,适合混合 IO 场景(如前台业务 + 后台备份)。
-
抢占调度:紧急命令(如 Flush、断电保护命令)可抢占当前执行队列,优先完成,保障数据安全性。
-
命令重排:对单个 SQ 内的命令进行重排序(如合并相邻 LBA 读写),减少闪存寻址延迟。
06
-
超高吞吐量:多队列同时提交和执行命令,吞吐量较 SATA 提升 10 倍以上,支持每秒百万级 IOPS(IO Operations Per Second)。
-
超低延迟:环形缓冲区 + 独立中断设计,命令提交和完成延迟降至微秒级(SATA 为毫秒级)。
-
低 CPU 占用:MSI-X 中断分散负载,减少 CPU 中断处理时间;队列深度大,降低命令提交频率,减少 CPU 上下文切换。
-
场景适应性强:支持按应用场景配置队列参数(如数据库场景增加队列深度,实时业务提升队列优先级)。





