2011-09-19 32 views
7

我们已经写了使用netfilter钩子拦截IP数据包的LKM。问题是,在1Gb/s负载下,我们看到挂钩通过软irq只加载一个CPU内核。其他15个内核空闲。所以我认为钩子不是多线程的。多核系统上的Netfilter钩子

所以我的问题是:有什么办法可以解决钩在多个核心上处理?

回答

9

该prolem不是来自netfilter,是你的内核管理中断的方式。

默认情况下,APIC的旧版本会将所有中断传递给CPU0。

您可以检查,如果这是你的问题有:

cat /proc/interrupts 

你可以看到,如果网卡的中断(请记住netfilter的钩子都在RX或TX软中断执行)由处理单核。

在较新版本的内核中,有一个编译选项(CONFIG_HOTPLUG_CPU),它在现有内核之间平衡了IRQ。

或者,如果你不能更新版本或重新编译内核,您可以更新SMP亲和力(与处理更是一个CPUID面具)尝试不同核心之间的平衡。或者进入ACPI并进行适当的配置(这里我无法再提供帮助)。

Here你可以找到所有关于这个东西(SMP affininty和适当的IRQ处理)

+0

谢谢。我知道了。 –

6

的问题可能是你的网卡只有一个中断。一些较新的NICS有几个中断(所谓的多队列NIC),允许负载分散在多个线程中。

对于单队列网卡,可以在新内核中使用一些软件功能,您可以配置该功能来传播负载。见例如http://www.spinics.net/lists/linux-doc/msg02975.html了解可用的概述。