Das Problem liegt nicht am Netfilter, sondern an der Art und Weise, wie Ihr Kernel Interrupts verwaltet.
Standardmäßig liefern alte APIC-Versionen alle Interrupts an CPU0.
Sie können überprüfen, ob dies Ihr Problem ist mit:
cat /proc/interrupts
Sie können sehen, ob die Interrupts der NIC (und denken Sie daran, dass die Netfilter-Hooks über ein RX- oder TX-SoftIRQ ausgeführt werden) von einem einzelnen Kern verarbeitet werden.
In neueren Versionen des Kernels gibt es eine Kompilierungsoption (CONFIG_HOTPLUG_CPU), die die IRQs über die vorhandenen Kerne verteilt.
Oder wenn Sie die Version nicht aktualisieren oder den Kernel neu kompilieren können, können Sie die SMP-Affinität aktualisieren (mit einer Maske, die mehr als eine CPUid verarbeitet), um zu versuchen, zwischen verschiedenen Kernen auszugleichen. Oder gehen Sie in ACPI und die richtige Konfiguration (hier kann ich nicht mehr helfen).
Hier finden Sie alles über diese Dinge (SMP-Affinität und korrekte IRQ-Behandlung)
Ein Problem könnte sein, dass Ihre NIC nur einen Interrupt hat. Einige neuere NICS haben mehrere Interrupts (sogenannte Multiqueue-NICs), wodurch die Last auf viele Threads verteilt werden kann.
Für Single-Queue-NICs sind in neueren Kerneln einige Softwarefunktionen verfügbar, die Sie konfigurieren können, um die Last zu verteilen. Siehe z.B. http://www.spinics.net/lists/linux-doc/msg02975.html für einen Überblick darüber, was verfügbar ist.