我们写了使用netfilter钩子截取IP数据包的LKM。 问题是,在1Gb / s的有效负载上,我们看到挂钩通过软irq只加载一个CPU内核。 其他15个核心空闲。 所以我认为钩子不是multithreading的。
所以我的问题是:有什么办法我可以disribute钩在多个核心处理?
prolem不是来自netfilter,是内核管理中断的方式。
默认情况下,APIC的旧版本将所有中断传递给CPU0。
你可以检查这是否是你的问题:
cat /proc/interrupts
您可以看到NIC的中断(并记住netfilter钩子是通过RX还是TX SoftIRQ执行的)是由单个Core处理的。
在较新版本的内核中,有一个编译选项(CONFIG_HOTPLUG_CPU),它将IRQ平衡到现有的内核上。
或者,如果您无法更新版本或重新编译内核,则可以更新SMP关联(使用处理更多CPUid的掩码)以尝试在不同的Core之间进行平衡。 或者进入ACPI和正确的配置(在这里我不能帮助更多)。
在这里你可以找到所有关于这个东西(SMP affininty和适当的IRQ处理)
一个问题可能是您的网卡只有一个中断。 一些较新的NICS有几个中断(所谓的多队列NIC),允许负载分散在多个线程中。
对于单队列网卡,可以在新内核中使用一些软件功能,您可以配置这些软件来分散负载。 有关可用内容的概述,请参见http://www.spinics.net/lists/linux-doc/msg02975.html 。