【发布时间】:2011-09-19 07:32:15
【问题描述】:
我们编写了使用 netfilter 钩子拦截 IP 数据包的 LKM。问题在于,在 1Gb/s 的有效负载上,我们看到挂钩通过软 irq 仅加载一个 CPU 内核。其他 15 个核心空闲。所以我得出结论,钩子不是多线程的。
所以我的问题是:有什么方法可以在多核上分发钩子处理?
【问题讨论】:
标签: linux hook multicore netfilter
我们编写了使用 netfilter 钩子拦截 IP 数据包的 LKM。问题在于,在 1Gb/s 的有效负载上,我们看到挂钩通过软 irq 仅加载一个 CPU 内核。其他 15 个核心空闲。所以我得出结论,钩子不是多线程的。
所以我的问题是:有什么方法可以在多核上分发钩子处理?
【问题讨论】:
标签: linux hook multicore netfilter
问题不在于 netfilter,而在于您的内核管理中断的方式。
默认情况下,旧版本的 APIC 会将所有中断传递给 CPU0。
您可以检查这是否是您的问题:
cat /proc/interrupts
您可以查看 NIC 的中断(并记住 netfilter 挂钩是通过 RX 或 TX SoftIRQ 执行的)是否由单个内核处理。
在较新版本的内核中,有一个编译选项 (CONFIG_HOTPLUG_CPU),用于平衡现有内核的 IRQ。
或者,如果您无法更新版本或重新编译内核,您可以更新 SMP 亲和性(使用处理比 CPUid 更多的掩码)以尝试在不同内核之间进行平衡。或者进入 ACPI 和正确的配置(这里我无能为力)。
Here 你可以找到关于这些东西的所有信息(SMP 亲和性和正确的 IRQ 处理)
【讨论】:
问题可能是您的 NIC 只有一个中断。一些较新的 NICS 有多个中断(所谓的多队列 NIC),允许负载分散到多个线程中。
对于单队列 NIC,较新的内核中提供了一些软件功能,您可以对其进行配置以分散负载。参见例如http://www.spinics.net/lists/linux-doc/msg02975.html 了解可用内容的概述。
【讨论】: