我们编写了使用 netfilter 钩子(Hook)拦截 IP 数据包的 LKM。问题在于,在 1Gb/s 的有效负载上,我们看到 Hook 通过软 irq 仅加载一个 CPU 核心。其他 15 个核心处于空闲状态。所以我得出结论,hooks 不是多线程。
所以我的问题是:有什么方法可以在多个内核上分配 Hook 处理?
最佳答案
问题不是来自 netfilter,而是您的内核管理中断的方式。
默认情况下,旧版本的 APIC 将所有中断传递给 CPU0。
您可以检查这是否是您的问题:
cat /proc/interrupts
您可以查看 NIC 的中断(并记住 netfilter Hook 是通过 RX 或 TX SoftIRQ 执行的)是否由单个内核处理。
在较新版本的内核中,有一个编译选项 (CONFIG_HOTPLUG_CPU),用于平衡现有内核的 IRQ。
或者如果您无法更新版本或重新编译内核,您可以更新 SMP affinity(使用处理比 CPUid 更多的掩码)以尝试在不同的核心之间取得平衡。或者进入 ACPI 和适当的配置(在这里我帮不上忙)。
Here你可以找到关于这些东西的所有内容(SMP 亲和性和正确的 IRQ 处理)
关于linux - 多核系统上的 Netfilter Hook ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7467688/