如何激活所有在linux的ksoftirqds? (关于linux内核的networking堆栈)

我有一个4核心intel机器上的multiqueue NIC卡,我绑定在cpu核心(set / proc / irq / xxx / smp_affinity)上的NIC卡的每个队列让我们说core0上的queue0,core1上的queue1等等。

据说softirq会调用与硬件中断相同的内核。 为什么ksoftirqd不能在我的机器上运行? 这只是一个内核线程(如ksoftirqd / 2),它将使用100%的内核,而其他的则为0%

当我使用

cat /proc/interrupts | grep eth1 

我可以看到所有的软件包甚至分发到所有的NIC队列。

更新:

如果你可以阅读中文http://hi.baidu.com/higkoo/item/42ba6c353bc8aed76d15e9c3 (请参阅#7),那么这里有一个100%的softirq问题的解决scheme,如果没有的话,哪个博客说你可以添加另一个卡片,这个问题就解决了

ksoftirqd不需要平行运行,因为它通常不运行softirqs。 所有softirqs通常运行在请求它们的中断之后立即请求的CPU上。

只有在“softirq”泛滥的情况下,softirqs才会在ksoftirqd上运行 – 在内核执行中断之后,它会检查是否需要运行anu softirqs。 如果是这样,它会运行它们。 在这些运行中断启用期间,所以有可能在运行softirqs时发生一个中断,标志它们再次运行。 这就是为什么内核在运行之后会再次检查市场softirqs。

应该很明显的是,由于大量的中断,这可能会变成一个非常快速的活锁 – 我们所做的就是运行softirqs和中断,而不是任何用户代码。 这就是为什么内核有一个“阻尼器”的机制 – 如果在运行10次之后检查是否有软标记被标记,那么内核在中断结束时将不运行softirqs,而是唤醒特殊内核线程ksoftirqd运行它们,直到洪水结束。

这是处理IRQ洪水的监督机制,大部分时间处于休眠状态,因此在正常情况下使用多线程ksoftirqd并不能真正帮助你。

ksoftirqd是内核中所有轮询例程的基础,包括轮询你的卡的网络队列。

因此,触发ksoftirqd会影响它的线程。 事实是它根本不是线程的。 这是因为触发ksoftirqd的定时器总是被传送到同一个内核。

但是,你提出这个问题的目标。 首先谈论这个目标可能是有意义的,而不是实现这个目标的细节。