【问题标题】:Netfilter hooks on multi-core system多核系统上的 Netfilter 挂钩
【发布时间】:2011-09-19 07:32:15
【问题描述】:

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

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

【问题讨论】:

    标签: linux hook multicore netfilter


    【解决方案1】:

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

    默认情况下,旧版本的 APIC 会将所有中断传递给 CPU0。

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

    cat /proc/interrupts
    

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

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

    或者,如果您无法更新版本或重新编译内核,您可以更新 SMP 亲和性(使用处理比 CPUid 更多的掩码)以尝试在不同内核之间进行平衡。或者进入 ACPI 和正确的配置(这里我无能为力)。

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-07
        • 2021-04-14
        • 1970-01-01
        • 2015-11-28
        • 1970-01-01
        • 2021-01-08
        • 2016-04-01
        • 1970-01-01
        相关资源
        最近更新 更多