2012-12-05 40 views
2

我在4核intel机器上有一个多队列NIC卡和 我绑定了一个cpu核心上的NIC卡的每个队列(set/proc/irq/xxx/smp_affinity) 让我们例如core0上的queue0,core1上的queue1等等。如何激活linux中的所有ksoftirqds? (关于linux内核的网络堆栈)

据说softirq会在硬件中断发生的同一内核上调用。 为什么ksoftirqd无法在我的机器上平行运行? 这只是一个内核线程(如ksoftirqd/2),将使用核心的100%,但其他都是0%

当我使用

cat /proc/interrupts | grep eth1 

我可以看到,所有的包都均匀分布到所有NIC队列。

更新:

下面是100%的软中断问题的解决方案,如果你能读中国 http://hi.baidu.com/higkoo/item/42ba6c353bc8aed76d15e9c3(请参阅#7) 如果不是,其博客上说你可以添加另一张卡,这个问题将被解决

回答

0

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

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

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

+0

好的,我的问题是为什么它有100%的核心和0%的其他3核心,我希望所有的100%甚至分布在4核心,每个25%。 – dilfish

2

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

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

很明显,如果发生大量的中断,这可能会非常快速地变成活动锁定 - 我们所做的只是运行softirqs和中断,而不会执行任何用户代码。这就是内核具有“阻尼器”机制的原因 - 如果在运行10次后检查是否标记了任何softirq,它们仍会被标记,内核将不会在中断结束时运行softirqs,而是唤醒特殊内核线程ksoftirqd运行它们直到洪水结束。

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

+0

感谢您的澄清。是否有针对“洪水”情况的解决方案? – dilfish

+0

@dilfish是,更改内核代码。这就是为什么它是开源的:-) – gby