Netfilter挂钩多核系统

时间:2011-09-19 07:32:16

标签: linux hook multicore netfilter

我们写过LKM使用netfilter挂钩拦截IP数据包。问题是,在1Gb / s有效载荷上,我们看到钩子只通过软irq加载一个CPU核心。其他15个核心闲置。所以我得出的结论是钩子不是多线程的。

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

2 个答案:

答案 0 :(得分:9)

问题不是来自netfilter,是内核管理中断的方式。

默认情况下,旧版本的APIC会向CPU0提供所有中断。

您可以通过以下方式检查这是否是您的问题:

cat /proc/interrupts

您可以查看NIC的中断(并记住netfilter挂钩是通过RX或TX SoftIRQ执行的)由单个Core处理。

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

或者,如果您无法更新版本或重新编译内核,则可以更新SMP关联(使用处理更多CPUid的掩码)以尝试在不同的Core之间进行平衡。或者进入ACPI和正确的配置(这里我无法提供更多帮助)。

Here你可以找到所有这些东西(SMP亲和和正确的IRQ处理)

答案 1 :(得分:6)

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

对于单队列NIC,可以在较新的内核中使用一些软件功能,您可以配置这些功能以分散负载。参见例如http://www.spinics.net/lists/linux-doc/msg02975.html了解可用内容的概述。