Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在linux中激活所有ksoftirqd?(关于linux内核的网络堆栈)_Linux_Performance_Networking_Kernel_Irq - Fatal编程技术网

如何在linux中激活所有ksoftirqd?(关于linux内核的网络堆栈)

如何在linux中激活所有ksoftirqd?(关于linux内核的网络堆栈),linux,performance,networking,kernel,irq,Linux,Performance,Networking,Kernel,Irq,我有一个4核intel机器上的多队列NIC卡 我将网卡的每个队列绑定到cpu核心上(set/proc/irq/xxx/smp_) 让我们假设queue0在core0上,queue1在core1上,依此类推 据说softirq将在发生硬件中断的同一个内核上调用。 为什么ksoftirqd不能在我的机器上并行运行? 只有一个内核线程(如ksoftirqd/2)将使用100%的内核,而其他线程则为0% 当我使用 cat /proc/interrupts | grep eth1 我可以看到,所有包甚至

我有一个4核intel机器上的多队列NIC卡 我将网卡的每个队列绑定到cpu核心上(set/proc/irq/xxx/smp_) 让我们假设queue0在core0上,queue1在core1上,依此类推

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

当我使用

cat /proc/interrupts | grep eth1
我可以看到,所有包甚至都被分发到所有NIC队列

更新:

如果你能读中文,这里有一个解决100%软IRQ问题的方法 (请参见第7页)
如果没有,哪个博客说您可以添加另一张卡,这个问题将得到解决

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

因此,ksoftirqd的触发将影响它的线程性能。 事实上,它根本就没有线程。这是因为触发ksoftirqd的计时器始终传递到同一个内核


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

ksoftirqd不需要并行运行,因为它通常不运行softirq。所有SoftIRQ通常在CPU上运行,在请求它们的中断之后,它们被请求到CPU上

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

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


这是一种看门狗机制,用于处理IRQ洪水,并且大部分时间处于休眠状态,因此在正常情况下,使用多线程ksoftirqd不会真正帮助您

好的,我的问题是为什么它有100%在一个核心和0%在其他3个核心,我希望所有的100%均匀分布在4个核心,每个25%。感谢澄清。“洪水”事件有解决方案吗?@dilfish是的,更改内核代码。这就是为什么它是开源的:-)