目录
Create I/O Completion Queue command
Interrupt Vector & Interrupts Enabled
Create I/O Submission Queue command
Submission Queue (SQ) Associations
Number of Queues (Feature Identifier 07h)
简介
本文主要讲一下 Create IO Queue (包含 CQ 和 SQ),会提及所有相关配置。注意,是所有哦,如有遗漏,还望评论补充,感谢不尽。
Create I/O Completion Queue command,是用于创建 IOCQ 的 admin command。
Create I/O Submission Queue command,是用于创建 IOSQ 的 admin command。
详细描述
Create I/O Completion Queue command
该命令总共会涉及如下几个字段:
- PRP Entry 1
- Dword 10
- Dword 11
PRP1
PRP1 主要是配置了 Queue 存放的物理内存位置。该地址指针是以 memory page aligned,所以这条命令中 PRP entry 的 offset 都应该为 0。如果不为 0 时,SSD 应该回报一个 error:PRP Offset Invalid。
如果是指向的是一个 PRP List,那么需注意在 Delete IOCQ 之前或是 controller reset 之前,这个 PRP List 都不能改变。
Queue Size & QID
Dword 10 则配置了 Queue Size,Queue Identifier(QID)。
- 当 Queue Size 配置超过 SSD 支持的上限时,SSD 回报 error:Invalid Queue Size。由 nvme spec 定义的 Queue Size 支持区间为 2 ~ 65535,SSD 的定义则要看 CAP.MQES。当前消费级 SSD 一般将 MQES 定为 1023,少数定义为 16383。
- QID 用于创建 queue 之后的身份识别,与 Doorbel 会建立关联(the value y in the CQyHDBL)。该值不得超过 Number of Queues(host 下发 set feature 设定,需注意一些限制,详见章节“相关配置”)。当出现如下几种情况时,需回报 an error of Invalid Queue Identifier:
-
- QID 为 0
- QID 超出 Number of Queues 限制
- QID 重复使用
Physically Contiguous
由于 Physically Contiguous 导致创建 IOCQ 失败,可能是如下几种情况:
- abort 并回报 Invalid Field in Command 的状态码:当 Physically Contiguous bit 位清 0,且 CAP. CQR 被置 1 时,SSD 应该 abort 这条命令(Create IOCQ)。
- 回报 Invalid Use of Controller Memory Buffer 的状态码:如果同时满足 queue 是被放在 Controller Memory Buffer 上,PC 清 0,CMBLOC.CQPDS 清 0 时;SSD 应该 abort 这条命令。
Interrupt Vector & Interrupts Enabled
中断向量和中断使能的配置。
Command Completion
create IOCQ 命令完成时,controller 回报 admin CQ。出现异常时需要填写回报的一些栏位如下。
异常回报状态上述内容基本都有提及,除了:
在初始化 CC.IOCQES 字段之前 create IOCQ,需回报 Invalid Queue Size。
Create I/O Submission Queue command
讲完 Create I/O Completion Queue command,再讲 Create I/O Submission Queue command 就要轻松很多了。
该命令会涉及如下几个字段:
- PRP Entry 1
- Dword 10
- Dword 11
但除此之外,还多了一个:
- Dword 12
关于 PRP1、Queue Size、QID、Physically Contiguous 等描述与 Create IOCQ cmd 一致,就不重复描述了。与之不同的是,Dword 11 中新增了 CQID、QPRIO,以及新增了 Dword 12,其中含 NVMSETID。
CQID
CQID,Completion Queue Identifer,用于将指定 ID 的 ISCQ 与当前 IOSQ 绑定。
- 该字段为 0,则 controller 应 abort 命令并回报 Invalid Queue Identifer 的状态码。
- 该字段超出 controller 支持范围,则 controller 应 abort 命令并回报 Invalid Queue Identifier。
- 如果指定的不是已创建的 IOCQ,则 controller 应 abort 命令并回报 Completion Queue Invalid。
QPRIO
QPRIO,Queue Priority,用于指定当前 SQ 的命令优先级。总共有 4 个优先级,详见章节“相关配置”。
仅当选择 weighted round robin with urgent priority class 作为仲裁机制时,才会使用该字段。
NVMSETID
NVMSETID,NVM Set Identifier,用于指定与当前 SQ 关联的 NVM Set。
如果该字段被清零为 0h,或者不支持 SQ 关联功能,则此提交队列不与任何特定的 NVM 集关联。
如果该字段设置为 NVM Set List 中未指定的非零值,并且支持 SQ 关联功能,则 controller 应以 Invalid Field in Command 的状态码 abort 该命令。
主机不应在此 SQ 中提交与其他 NVM Set 关联的命名空间的命令。
Submission Queue (SQ) Associations
Submission Queue (SQ) Associations 是 NVM Express spec 中一项用于优化性能和保障服务质量的可选功能。主要用于 Predictable Latency Mode 使能时,帮助 controller 更好第管理 IO Queue 与 NVM Set 之间的关系,以提升系统性能。关于 Predictable Latency Mode 和 Submission Queue (SQ) Associations 的进一步描述在本文就不做展开介绍。
相关配置
Create I/O Completion Queue
PRP Entry 1
Dword 10
Dword 11
Physically Contiguous (PC)
仅是 1 个 bit 位,表示创建的 CQ 是否是物理连续。
该 bit 置 1 时,则 CQ 是物理连续,且 PRP1 是指向一片物理连续内存的地址。
该 bit 清 0 时,则 CQ 不是物理连续,且 PRP1 是一个 PRP List 指针。(如该描述看不懂,可先去看看 PRP 章节)
Create I/O Submission Queue
Dword 11 部分
Dword 12
CAP. MQES
Maximum Queue Entries Supported。
Contoller 告知 Host 能支持多大的 queue size。这里的 queue 指 IOCQ 和 IOSQ。
0’s based value。最小值为 1,表示最少支持 2 个 entries。
CAP. CQR
Contiguous Queues Required。
是 Controller 上报给 Host 的能力信息中的 1 个 bit 位,表示 Controller 是否支持 Queue 的物理连续。
bit 为 1,表示 Controller 要求物理连续。此时,CDW11.PC 也必须为 1。
bit 为 0,表示 Controller 支持物理不连续。
注意:当 Controller 使用 message-based transport ,则 CQR 必定为 1。
消费级 SSD 的该配置基本都是 1。
CMBLOC.CQPDS
CMB Queue Physically Discontiguous Support (CQPDS)
Number of Queues (Feature Identifier 07h)
通过 set feature 命令执行,表明 host 向 controller 请求的 queue 个数。
- 该 feature 必须在 create queue 之前下发。如果这条 set feature 命令晚于 create queue 下发,那么就会被 abort,并回报 Command Sequence Error 的状态码。
- controller 在两次 resets 期间都不能改变该 feature 值。
NCQR & NSQR
Set Feature 关注 Dword 11。
Number of I/O Completion Queues Requested (NCQR):host 请求的 IOCQ 的个数。0’s based value。最小支持 1 个 Queue。最大值为 65534,表示 65535 个 Queue。如果该值为 65535 时,则 SSD abort cmd 并回报 Invalid Field in Command 的状态码。
Number of I/O Submission Queues Requested (NSQR):描述的是 IOSQ,描述内容与上述 IOCQ 一致。
NCQA & NSQA
Get Feature 关注 Dword 10。
Number of I/O Completion Queues Allocated (NCQA):实际 controller 分配的 IOCQ 的个数。最少应分配 1 个,该值可能与 host 请求的个数不一样。
Number of I/O Submission Queues Allocated (NSQA):同 IOCQ。
CC.IOCQES & CC.IOSQES
IOCQES,I/O Completion Queue Entry Size,I/O 完成队列条目的大小,定义了用于所选 I/O 命令集的 I/O 完成队列条目的大小。此字段要求的最大值由 Identify Controller data structure 中的 CQES 字段指定。
IOSQES,对象改成了 IOSQ,定义及特征与 IOCQ 无异。
CQES & SQES
注意事项
CAP. MQES 和 CQES & SQES 有何区别?
MQES:指单个 Queue 的最大深度。
CQES & SQES:指的是单个 Queue Entry 的最大大小。
QSIZE:指的是单个 Queue 的深度。
CC.IOCQES & CC.IOSQES:指的是当个 Queue Entry 的大小。
结语
到这里,关于 Queue 的创建及相关配置就讲得差不多了,内容不能说百分百齐全吧,但应该也到了百分九十九的程度。毕竟 NVMe IO 队列设置里的门道可不少,从控制器模式到队列条目大小,每个参数都像一个个小齿轮,共同驱动着 NVMe 存储系统的高效运转。搞懂这些参数差异和规范设置,可是优化性能的小秘诀哦!
Reference
NVM Express® Base Specification, Revision 2.2