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

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

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

  • 每天会有很多快递,希望可以由老板帮忙代收,你定期来取;
  • 正常情况下,你每天下午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)对以下几种中断类型的支持:

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

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

  3. 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。

Bits描述
31:16Reserved
15:08Aggregation Time (TIME):聚合时间限制,指定了控制器在中断聚合时,建议的最大延迟响应中断时间,以 100us 为本字段增量单位。0h 值表示设定为没有延迟(关闭此限制)。控制器可能根据自身设计,将此值用于全局计时/根据中断向量号分别独立计时。此设定在重置后默认为 0h 值。
07:00Aggregation Threshold (THR):聚合数量限制,指定了控制器在中断聚合时,在向主机上报中断前,针对每个中断向量建议的最小完成队列条目聚合数量。这是个 0-Based 字段(0h 值代表数值1的含义)。此设定在重置后默认为 0h 值。

Interrupt Vector Configuration (Feature ID 09h)

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

Bits描述
31:17Reserved
16Coalescing Disable (CD):聚合功能关闭控制。当置为“1b”时,任何中断聚合的设定都不应再用于指定的中断向量号。当清为“0b”时,所有中断聚合设定会重新应用于指定的中断向量号。
15:00Interrupt Vector (IV):中断向量号,此字段指定当前希望控制关闭/开启的中断向量号。

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

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

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

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

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

  • 15
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值