分配与MSI(消息信号中断)不同的NIC队列的IP数据包

NetXtreme II BCM5709千兆以太网卡支持MSIfunction(消息信号中断),并有8个队列。 每个队列在/ proc / interrupts中都有自己的中断处理程序。 我试图完成的是告诉NIC哪些数据包应该进入哪个队列。

问题:

  1. 是否可以通过封装的协议types手动指定哪些IP数据包应该进入哪个队列(例如IPsec数据包进入一个队列,而TCP数据包进入另一个队列)?
  2. 如果可能的话 – 我怎样才能在Linux下做到这一点?
  3. 如果这是不可能的 – 我应该看一下支持MSI-X的网卡来解决这个问题吗?

更多细节:

我们有一个接口正在终止IPSec和转发/终止TCP连接。 IPSec数据包解密是内联的(这意味着解密在相同的ksoftirqd / X上下文中完成)。 我们试图找出如果IPSec数据包在另一个CPU上被调度而不是TCP数据包,我们是否能够提高总体性能。 另一个限制是IPSec代码不是MP安全的,因此我不能在多个ksoftirqd / X下运行它。 默认情况下,数据包似乎是通过8个NIC队列上的源IP分发/散列的。 瓶颈在于IPSec,它在遏制/encryption处于ksoftirqd / X上下文中的100%CPU的IPSec数据包时扼杀TCPstream量。

OS是Ubuntu 10.10(2.6.32-27-服务器),NIC是Broadcom BCM5709。

如果其他人将试图找出如何使Linux Networking TCP / IP堆栈在多个CPU核心上扩展…

MSI可以被两种底层NIC技术利用来在多个队列中分发数据包。 每个NIC队列由专用CPU内核上的不同中断处理,以实现可扩展性:

  1. RSS(接收方缩放) – 通过源和目标IP将分组分发到不同的队列,如果适用,则通过TCP / UDP源和目标端口进行分发。
  2. VMDq(虚拟机设备队列) – 通过MAC地址或VLAN标签分发数据包。 主要由VMpipe理程序使用,但我没有看到任何理由不能在非VM设置中使用。

RSS的问题在于它始终使用源IP来生成散列。 散列用于查找该数据包应该到哪个队列。 这意味着不能控制哪些数据包应该进入哪个队列,除非他也控制了源IP。

VMDq似乎更适合我的问题,因为它通过目标MAC地址分发数据包。 它可以像分配两个不同的IP地址到同一个接口一样简单。

资源: