设想有这样一个场景:你是一个非常喜欢网购的人,每天都会在网上买各种各样的商品,每天都有大量的快递要收。然而,你所居住的小区并不允许快递员进入,因此你不得不每天多次往返小区门口,有时刚刚回到家,就又接到另一家快递公司电话,这让你非常闹心。
聪明的你想到一个办法,小区门口刚好有一家便利店,也许可以临时存放快递。于是你去找到老板,告诉他你的需求:
仗义的老板爽快地答应了你的请求,自此,你每天也轻松了许多,不用盯着每一件快递的进度,也不用频繁取快递,可以更加专注自己的事情。每次取快递虽然更辛苦了,但是整体效率提升了很多。而要说缺点,老板、快递员都不知道哪件快递是你想早点拿到的,更不会第一时间通知你,因此个别快递会有一些时效问题,不过这都是小事儿,整体来说还是可以接受的。
“实在不行和老板说,改成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 Spec 中,指定了中断聚合功能(特指 Feature Identifier 08h)对以下几种中断类型的支持:
为了更低的延迟表现,更高效的中断处理,以及更均衡的中断负载等等,MSI-X 相对其他类型而言是更好的选择。
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,否则控制器会终止此非法命令并返回错误状态码。
除了上述的协议指定规则外,中断聚合功能还有一些具体的规则需要遵守:
至此,NVMe SSD 的中断聚合功能已基本介绍完毕。作为 I/O 命令的“快递代收点”,中断聚合有效释放了主机端宝贵的硬件资源,提升了整个存储系统在大压力场景下的性能。而作为新一代高性能 PCIe 5.0 企业级 NVMe SSD 的典范,忆恒创源 PBlaze7 7940 系列 SSD 中也配置了中断聚合功能,降低多盘部署下对于服务器硬件的性能要求,帮助客户降低硬件成本,并为大压力下的业务体验带来保障。