Linux 多核系统上的Netfilter挂钩

Linux 多核系统上的Netfilter挂钩,linux,hook,multicore,netfilter,Linux,Hook,Multicore,Netfilter,我们已经编写了LKM,它使用netfilter挂钩拦截IP数据包。问题是,在1Gb/s的负载上,我们看到挂钩通过软irq只加载一个CPU内核。其他15个内核处于空闲状态。所以我得出结论,hook不是多线程 所以我的问题是:有什么方法可以在多个内核上分配钩子处理吗?问题不在于netfilter,而在于内核管理中断的方式 默认情况下,APIC的旧版本将所有中断发送到CPU0 您可以检查这是否是您的问题: cat /proc/interrupts 您可以看到NIC的中断(请记住netfilter挂钩

我们已经编写了LKM,它使用netfilter挂钩拦截IP数据包。问题是,在1Gb/s的负载上,我们看到挂钩通过软irq只加载一个CPU内核。其他15个内核处于空闲状态。所以我得出结论,hook不是多线程


所以我的问题是:有什么方法可以在多个内核上分配钩子处理吗?

问题不在于netfilter,而在于内核管理中断的方式

默认情况下,APIC的旧版本将所有中断发送到CPU0

您可以检查这是否是您的问题:

cat /proc/interrupts
您可以看到NIC的中断(请记住netfilter挂钩是通过RX或TX SoftIRQ执行的)是否由单个内核处理

在较新版本的内核中,有一个编译选项(CONFIG_HOTPLUG_CPU),用于平衡现有内核上的IRQ

或者,如果无法更新版本或重新编译内核,则可以更新SMP关联(使用处理CPUid以上的掩码),以尝试在不同的内核之间实现平衡。或者进入ACPI并进行适当的配置(在这里我无能为力)


您可以找到关于这些内容的所有信息(SMP亲和性和适当的IRQ处理)

问题可能是您的NIC只有一个中断。一些较新的NIC具有多个中断(所谓的多队列NIC),允许负载分布在多个线程之间

对于单队列NIC,较新内核中提供了一些软件功能,您可以配置这些功能以分散负载。请参阅,例如,了解可用内容的概述