NetXtreme II BCM5709千兆以太网卡支持MSIfunction(消息信号中断),并有8个队列。 每个队列在/ proc / interrupts中都有自己的中断处理程序。 我试图完成的是告诉NIC哪些数据包应该进入哪个队列。
问题:
更多细节:
我们有一个接口正在终止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内核上的不同中断处理,以实现可扩展性:
RSS的问题在于它始终使用源IP来生成散列。 散列用于查找该数据包应该到哪个队列。 这意味着不能控制哪些数据包应该进入哪个队列,除非他也控制了源IP。
VMDq似乎更适合我的问题,因为它通过目标MAC地址分发数据包。 它可以像分配两个不同的IP地址到同一个接口一样简单。
资源: