Ursache:
Rxqueue und Txqueue (Empfangs- und Sendepuffer Netzwerk) werden von unterschiedlichen Cores verarbeitet. Die Kommunikation der CPU-Kerne untereinander verursacht die Last.
Lösung: Beide Puffer auf gleiches Core legen.
Schritt für Schritt:
1) Softwareinterrupts der beiden Puffer ermitteln:
cat /proc/interrupts
(die Irqnummer steht ganz links in den Zeilen, die auf "ethX-rx-X" bzw. "ethX-tx-X" enden)
2) beide Puffer auf das gleiche Core legen
echo UMGERECHNETE-CORENUMMER > /proc/irq/IRQNUMMER/smp_affinity
z.B.: "echo 4 > /proc/irq/29/smp_affinity" legt IRQ 29 auf Core 2(!)
Der Wert entspricht 2hochCorenummer, also:
Schritt für 2. Queue wiederholen.
Manche Netzwerkkarten liefern mehrere Rx/Tx-Paare. Dann für jedes Paar wiederholen.
Anmerkung:
Ahnlicher, aber geringerer Effekt bei Energiesparmechanismen (ACPI, Powernow usw.). Diese dann ganz abschalten.
Weitere Maßnahmen:
TX Queue (Sendewarteschlangenlänge) erhöhen:
ifconfig interface txqueuelen 20000 setzt auf Maximum
Receive Descriptor erhöhen (d.h. die Anzahl der Pakete nach denen der Treiber einen IRQ auslöst
(weniger IRQs=weniger CPU-Last).
ethtool -g interface zeigt Einstellungen
ethtool -G Interface rx 4096 setzt auf Maximum
Guttenbergs:
http://www.heise.de/ct/hotline/Linux-Prozesse-an-CPU-Kerne-binden-1002732.html