4

我在 4 核英特尔机器上有一个多队列 NIC 卡,我将 NIC 卡的每个队列绑定在一个 cpu 内核上(设置 /proc/irq/xxx/smp_affinity)假设 core0 上的 queue0,core1 上的 queue1 等等。

据说软中断将在发生硬件中断的同一个内核上调用。为什么 ksoftirqd 不能在我的机器上并行运行?它只是一个内核线程(如 ksoftirqd/2)将使用 100% 的内核,但其他内核线程为 0%

当我使用

cat /proc/interrupts | grep eth1

我可以看到所有的包甚至都分发到了所有的 NIC 队列中。

更新:

这里是100%softirq问题的解决方案,如果你能看懂中文 http://hi.baidu.com/higkoo/item/42ba6c353bc8aed76d15e9c3(请看#7)如果不行,哪个博客说你可以再加一张卡,这个问题将得到解决

4

2 回答 2

2

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

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

很明显,如果出现大量中断,这可能会很快变成活锁——我们所做的只是运行软中断和中断,而不是任何用户代码。这就是内核有一个“阻尼器”机制的原因——如果在运行 10 次后检查是否有任何软中断被标记,它们仍然被标记,内核将不会在中断结束时运行软中断,而是唤醒特殊的内核线程ksoftirqd 运行它们直到洪水结束。

这是一个处理 IRQ 泛滥的看门狗机制,并且大多数时候它处于休眠状态,因此在正常情况下拥有多线程 ksoftirqd 并不会真正帮助您。

于 2012-12-06T09:09:13.043 回答
0

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

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

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

于 2012-12-06T08:47:09.747 回答