如先前承诺的一样,在这里笔者将会介绍MSI/MSI-X中断方式,这是一种和传统设备的INTx方式不同的新的中断方式。
随着处理器速度的不断提升,I/O设备的吞吐量也日益见涨,人们开始逐渐碰到了一些以往没有碰到过的问题:更大的吞吐量需要吞噬更多的CPU能力:
在近14万IOps下,笔者的Core i7 920系统具有近15%的CPU占用率,这已经超过了单个Core i7 920核心的处理能力
如上图所示,Dynamo.exe进程是Iometer的负载产生器,占用率为4%,而“系统中断”项目,则是表现了驱动程序在处理磁盘控制器的I/O吞吐而消耗在ISR(中断服务例程)和DPC(延迟过程调用)上的处理器能力,在老旧的平台上,它将会很快压垮一个单一的CPU核心并导致其成为瓶颈。这个情况的出现包括了硬件和软件上的因素,14万IOps不算高,靠单个CPU核心来处理肯定是不行的,硬件和软件都需要为消除单点瓶颈而走向多核化而设计。
软件上的其中一个因素:到底改进了什么?Win7/2008 R2内核剖析
PCIe设备出生起就支持MSI中断方式,从PCIe 1.1版本起则支持MSI-X增强中断方式
工业界当然准备了相关的解决方案,对通用的设备来说,PCI总线为其准备了MSI/MSI-X中断方式,其中,MSI在PCI 2.2规范当中引入,MSI-X则在PCI 3.0规范中引入。对于常见的PCIe总线而言,1.0版本开始就能支持MSI,1.1开始支持MSI-X;PCIe设备必须支持MSI/MSI-X的其中一种。
那么, MSI/MSI-X是什么呢?
两代SAS HBA:中间的为LSI SAS 9211-8i,规格是PCIe 2.0、SAS 6Gb/s;上为LSI SAS 3041E-R,下为LSI SAS 3081E-R,它们的规格都是PCIe 1.0a和SAS 3Gb/s,自然,也只支持普通的MSI而不支持MSI-X
Interrupt中断是CPU与I/O设备交流的一种方法,中断发生后,被中断的CPU会停止当前工作而处理导致中断的设备的需求。通常以两种常用方法来实现中断:vectored向量化和polled轮询。这两种方法通常都会提供总线中断优先级别。向量化设备还会提供中断向量。轮询设备则不提供中断向量。
Legacy Interrupt传统中断-传统或固定中断是指使用早期总线技术的中断。使用这些技术,可通过一个或多个“带外”(也就是独立于I/O总线的总线,通常是几个连接到中断仲裁器的针脚)连线的外部管脚来发送中断信号。较新的总线技术(如 PCI Express)可以通过带内机制模拟传统中断来维持软件兼容性。
Message Signaled Interrupt消息告知中断-消息告知中断(Message Signaled Interrupt, MSI) 使用带内消息而不是使用带外的针脚,也就是在I/O总线内部通过发送一个消息来产生一个中断。这个消息在主桥(host bridge)上被解析并确定中断的目标地址。MSI可以实现将数据与中断消息一起发送。每个MSI都不是独占的,保证指定给某一设备的MSI在系统中是唯一的,而传统的中断则可以在最多四个PCI设备中共享。独占的中断可以消除在同一个中断号内分辨多个共享的设备的麻烦和性能降低,一个PCI功能可以最多请求1、2、4、8、16或者32个MSI中断向量。
Extended Message Signaled Interrupt扩展消息告知中断-扩展消息告知中断(Extended Message Signaled Interrupt, MSI-X) 是MSI的增强版本。与MSI相比,MSI-X 中断具有以下新增的优点:
支持2048个中断向量而不是32个中断向量,并且不再限制为2的幂,以及不再限制其必须为连续的中断向量
每个中断向量支持独立的消息地址和消息数据
支持按PCI功能遮罩或者按向量遮罩
软件分配的向量少于硬件请求的向量时可具有更大灵活性。软件可以在多个MSI-X插槽中重用相同的MSI-X 地址和数据。
所谓的“向量”,就是一个带有方向的“标量”,MSI/MSI-X中断向量可以同时指向多个不同的处理器乃至CPU核心,从而起到将负荷分布、并行处理中断的目的。有没有不需要消耗CPU资源处理中断的系统?暂时没有。在高吞吐量的系统上,中断处理是CPU一个很重要的工作。一些网络设备提供了“中断聚合”这样的机制用来降低中断量,但是在存储设备上笔者暂时还没有听说过(SATA/SAS协议内有类似的东西,不过里面的中断不是现在说的PCI总线内的中断)。这或许是以后的一个方向。
图上的LSI SAS 9211-8i使用了15个中断向量,其它如PCIe 2.0的GTX275显卡之类的都只使用了一个,而如使用传统中断1394控制器之类的普通设备甚至需要和多个其它设备共享
LSI SAS 9211-8i使用了15个中断向量,它支持MSI-X,当然这需要插在PCIe 1.1以上的插槽上,上图是是直接插在笔者的X58主板的一个PCIe 2.0 x16插槽上。假如插在南桥ICH10R上,那么带宽不仅会打半折,MSI-X特性也将会无从发挥。要SLI/CrossFire还是要完美的存储表现?这是一些高级玩家需要选择的问题。