linux - 多核系统上的 Netfilter Hook

标签 linux hook multicore netfilter

我们编写了使用 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/

相关文章:

linux - 日期和条件 bash 命令的奇怪但非常简单的问题

linux - 为刚刚创建的 LXC 容器运行 ansible 角色

linux - 如何使用 bash 命令列出进程使用的管道

git - Windows 上的接收后 Hook 和 Jenkins

git - 将 Git Hook 放入存储库

c - 是否可以 Hook 任何时间检索功能

json - 创建单个 IAM 用户以仅访问特定的 S3 存储桶

performance - Haskell——产生更少 Spark 的平行映射

algorithm - 用于在多核 x86 CPU 上进行测试的并行算法基准测试工具

python - 在 Mac 上构建通用二进制文件 - 强制单个编译器子进程