提交成功
返回列表

NVMe命令的“快递代收点”,聊聊中断聚合在SSD中的作用

2024 / 05 / 20
2

设想有这样一个场景:你是一个非常喜欢网购的人,每天都会在网上买各种各样的商品,每天都有大量的快递要收。然而,你所居住的小区并不允许快递员进入,因此你不得不每天多次往返小区门口,有时刚刚回到家,就又接到另一家快递公司电话,这让你非常闹心。

 

聪明的你想到一个办法,小区门口刚好有一家便利店,也许可以临时存放快递。于是你去找到老板,告诉他你的需求:

 

  • 每天会有很多快递,希望可以由老板帮忙代收,你定期来取;

 

  • 正常情况下,你每天下午6点钟会把积攒的快递取走;

 

  • 如果快递过多,老板会提前给你打电话,要求把快递取走;

 

  • 第二天同一时间,你也会提早来取新的快递,避免积攒太多快递给老板带来不便。

 

 

仗义的老板爽快地答应了你的请求,自此,你每天也轻松了许多,不用盯着每一件快递的进度,也不用频繁取快递,可以更加专注自己的事情。每次取快递虽然更辛苦了,但是整体效率提升了很多。而要说缺点,老板、快递员都不知道哪件快递是你想早点拿到的,更不会第一时间通知你,因此个别快递会有一些时效问题,不过这都是小事儿,整体来说还是可以接受的。

 

“实在不行和老板说,改成6小时去取一次吧,反正找个平衡就行。”你在心里对自己默默地说道。

 

上述场景正是中断聚合在我们日常生活中的写照。接下来,我们以更严谨准确的协议解释,来说一说中断聚合到底是什么,能够为 NVMe SSD 带来哪些好处,以及中断聚合要怎么用。

 

 

上图是典型的 NVMe CMD 处理流程:


1.    主机将命令写入 Submission Queue(提交队列) 
2.    主机更新对应 Submission Queue 的 Door Bell 寄存器(来通知控制器有新的命令需要处理)
3.    控制器去 Submission Queue 指定位置取走命令
4.    控制器处理命令
5.    控制器把命令完成状态写入 Completion Queue(完成队列)
6.    控制器产生中断(来通知主机 CQ 已更新)
7.    主机处理 Completion Queue 中的完成状态
8.    主机更新对应 Completion Queue 的 Door Bell 寄存器(来释放完成队列资源)

 

对于中断聚合功能而言,需要重点关注的就是 步骤6 —— 控制器产生中断

 

在未开启中断聚合功能时,相当于控制器只要完成一点任务,就要去通知主机处理后续。然而,主机与控制器之间的效率节奏是各有差异的,单纯地响应每次中断,会给主机增加不必要的开销。这种开销在主机较为繁忙,特别是高并发大压力 I/O 访问场景下,对于性能的影响会比较突出。

 

中断聚合是解决这种问题的一个有效方案,它的原理主要就是将这种频繁的中断请求集中起来,按照主机认为合适的频率去上报,从而更加高效地利用主机的处理器资源。部分 I/O 延迟会有小幅度增加,但整体延迟能够得到有效降低,在高并发大压力 I/O 访问场景下的性能会更好。

 

 

NVMe 协议支持的中断类型

 

在 NVMe Spec 中,指定了中断聚合功能(特指 Feature Identifier 08h)对以下几种中断类型的支持:

 

  • Pin Based 中断:顾名思义是利用中断相关的PIN来上报中断信号,这种中断方式主要针对 PCI 总线设计,总线会为每一个设备分配4个 INTx 引脚(INTA#,INTB#,INTC#,INTD#),利用电平触发方式上报中断。PCIe 总线下为了保持向下兼容性,保留了这个机制,但是通过 INTx Message Packet 模拟中断 PIN 的置位和复位,而非物理真实的独立中断 PIN。

 

  • Single/Multiple MSI 中断:MSI,即 Message Signaled Interrupts,它是针对 PIN Based 中断的存储同步问题(中断信号比数据信息先抵达,导致主机读取数据错误的问题)而设计的一种中断机制。数据和 MSI 中断报文会通过同一路径传输(Memory Write TLP,数据在先,中断在后),从而保证主机顺利处理中断。根据报文中相应 Control 字段定义的 Capability 不同,可以决定一次报文传输的中断请求数量,来区分是 Single 还是 Multiple(最大32个)MSI。

 

  • MSI-X 中断:作为 MSI 的拓展(X for Extended),机制基本相同。但 MSI 最多只支持32个中断请求,且要求中断向量连续。而 MSI-X 可以支持多达2048个中断请求,并且对中断向量连续性没有要求。与 MSI 不同的是,MSI-X 使用放置在内存中的数组(MSI-X Table)存放中断的信息,而在报文中只保存数组在内存里的地址,以及数组的大小等。 

 

为了更低的延迟表现,更高效的中断处理,以及更均衡的中断负载等等,MSI-X 相对其他类型而言是更好的选择。 

 

 

NVMe 协议中断聚合功能的详细解读

 

NVMe Spec 并没有定义具体的中断聚合算法,也不干预各控制器厂家、SSD 开发者对于相应算法的具体实现。它只是定义了主机可以指定的两个 Feature ID,来向控制器传达主机期望的聚合参数配置建议值。最终的实现由控制器内部相应模块逻辑,以及 Firmware 逻辑配合决定。

 

这两个 Feature ID 分别对应的定义如下:

 

Interrupt Coalescing (Feature ID 08h)

 

这是一个全局的设定参数,即设定会同时作用于所有 I/O 中断向量,无法分别单独设置。当 Aggregation Time 或者 Aggregation Threshold 的其中一个条件满足时,控制器就应当向主机上报中断信号。当两个设定任意其一为 0h 值时,相当于中断聚合功能关闭,每一条中断都会被直接上报。需要注意的是此功能只应用于 I/O 相关的中断向量,Admin 中断向量不建议也不支持使用中断聚合功能。当主机与设备之间的关系变化(更换设备/重置),或者中断类型变化时,此 Feature ID 的内容不要求被保持,并且建议主机重新设定此 Feature ID。

 

 

Interrupt Vector Configuration (Feature ID 09h)

 

这个 Feature 一次只能设定指定的一个中断向量号。默认情况下,中断聚合的设定会对所有中断向量启用(除了不支持中断聚合的 Admin Completion Queue 对应的向量 —— IV0)。在主机发送命令设置此 Feature 之前,需要确定希望指定的中断向量号已经绑定于现存的 I/O Completion Queue 之上,或者指定的中断向量号不是 Admin CQ 对应的 IV0,否则控制器会终止此非法命令并返回错误状态码。

 

 

除了上述的协议指定规则外,中断聚合功能还有一些具体的规则需要遵守:

 

  • 主机需要保证运行的操作系统内核在配置 I/O Completion Queue 时,不会将 Admin 专用的 IV0 向量号配置给 I/O 相关的 Queue。共用中断向量号 IV0 是不被允许和支持的,可能会导致一些无法预测的问题。

 

  • 当后台有 I/O 进行时,不建议对 Feature ID 08/09h 进行设置,这有可能造成 I/O 被打断,或者中断上报被挂起等无法预测的错误。NVMe 协议并没有禁止此行为,但属于一个使用上的建议。

 

  • Feature ID 08/09h 在协议中都不支持 Save,因此 Power Cycle/Controller Reset 等行为后,该参数会被重置为默认值,需要重新配置参数以生效。

 

至此,NVMe SSD 的中断聚合功能已基本介绍完毕。作为 I/O 命令的“快递代收点”,中断聚合有效释放了主机端宝贵的硬件资源,提升了整个存储系统在大压力场景下的性能。而作为新一代高性能 PCIe 5.0 企业级 NVMe SSD 的典范,忆恒创源 PBlaze7 7940 系列 SSD 中也配置了中断聚合功能,降低多盘部署下对于服务器硬件的性能要求,帮助客户降低硬件成本,并为大压力下的业务体验带来保障。