irqbalance – Interrupt Distribution Tuning Cheatsheet
irqbalance ist ein Daemon, der Hardware-Interrupts (IRQs) über CPU Cores verteilt. Standardmäßig kann Linux die meisten Interrupts von einem überlasteten NIC oder Storage-Controller zu CPU 0 leiten, was diesen Core zum Bottleneck macht, während andere Idle sind. irqbalance überwacht Interrupt-Last und rebalanciert IRQ-Affinität, um die Arbeit zu verteilen. Umgekehrt ist es für Latenz-kritische Workloads mit Hand-gepinnten CPUs oft absichtlich deaktiviert, so dass es Interrupts nicht auf isolierte Cores verschieben kann.
Installation
| Plattform | Befehl |
|---|
| Debian/Ubuntu | sudo apt install irqbalance |
| Fedora/RHEL | sudo dnf install irqbalance |
| Arch Linux | sudo pacman -S irqbalance |
| Service | sudo systemctl enable --now irqbalance |
| Überprüfen | irqbalance --version |
Zuerst Interrupts inspizieren
| Befehl | Zeigt |
|---|
cat /proc/interrupts | Per-CPU Interrupt Zählungen nach Gerät |
watch -n1 'cat /proc/interrupts' | Live Wachstum (erkennen Sie den Hot Core) |
mpstat -I SUM -P ALL 1 | Interrupts pro CPU pro Sekunde |
cat /proc/irq/<N>/smp_affinity | Affinität-Maske für einen IRQ |
cat /proc/irq/<N>/smp_affinity_list | Gleich, als CPU-Liste |
# Absorbiert ein CPU alle NIC Interrupts?
watch -n1 "grep -E 'eth0|mlx|ens' /proc/interrupts"
Den Daemon laufen
| Befehl | Beschreibung |
|---|
sudo systemctl status irqbalance | Überprüfen Sie es läuft |
sudo irqbalance --foreground | Laufen Sie im Vordergrund (Debugging) |
sudo irqbalance --oneshot | Balancieren Sie einmal, dann exit |
sudo irqbalance --debug | Ausführliche Entscheidungen |
Wichtige Optionen / Environment
| Einstellung | Effekt |
|---|
IRQBALANCE_BANNED_CPUS=<mask> | Weisen Sie nie IRQs zu diesen CPUs zu |
--banirq=N | Schließen Sie einen spezifischen IRQ von Balancing aus |
--policyscript=PATH | Script, das Pro-IRQ Policy entscheidet |
--interval=SECONDS | Rebalance Intervall |
| `—hintpolicy=exact | subset |
--powerthresh=N | Power-Save Konsolidierungs-Schwellwert |
Konfiguration lebt normalerweise in /etc/default/irqbalance oder /etc/sysconfig/irqbalance.
# Behalten Sie IRQs weg von isolierten Cores 8-15 (Maske für CPUs 8..15)
echo 'IRQBALANCE_BANNED_CPUS=0000ff00' | sudo tee -a /etc/default/irqbalance
sudo systemctl restart irqbalance
Manuelle IRQ Affinität (wenn Sie den Daemon deaktivieren)
# Pin IRQ 42 zu CPU 2 (Bitmask 0x4)
echo 4 | sudo tee /proc/irq/42/smp_affinity
# Oder nach CPU Liste
echo 2 | sudo tee /proc/irq/42/smp_affinity_list
| Ansatz | Verwenden |
|---|
| irqbalance läuft | Allgemeine Server, variable Last |
| irqbalance deaktiviert + Manuelle Pinning | Low-Latency, NUMA-gepinnt, RT Workloads |
| Banned CPUs | Hybrid: Balancieren, aber schützen Sie isolierte Cores |
Latenz-Kritisches Pattern
# Typische Low-Latency Setup: Stop der Balancer, Pin NIC IRQs nahe der App's NUMA Node
sudo systemctl stop irqbalance
sudo systemctl disable irqbalance
# dann setzen Sie smp_affinity für die NIC's IRQs zu Cores auf der gleichen NUMA Node
Paaren Sie mit numactl so dass die App’s Speicher und das Interrupt-Handling auf dem gleichen NUMA Node leben – Cross-Node Interrupt-Handling ist eine klassische verborgene Latenz-Quelle.
Überprüfen Sie die Änderung
| Check | Befehl |
|---|
| Interrupt Ausbreitung | mpstat -I SUM -P ALL 1 |
| Softirq Last | top → %si pro CPU |
| Netzwerk-Durchsatz | sar -n DEV 1 |
| Per-IRQ Zählungen | watch 'cat /proc/interrupts' |
Der Erfolg sieht aus wie Interrupt-Zählungen wachsen gleichmäßig über beabsichtigte Cores (oder konzentriert auf genau die Cores, die Sie wählten).
irqbalance vs verwandte Tuning
| Tool | Rolle |
|---|
| irqbalance | Verteilen Sie IRQs über CPUs |
| numactl | Binden Sie Process CPU/Memory an NUMA Nodes |
| cpupower | Frequency/Idle-State Kontrolle |
| tuned | Ganz-System Profile (kann irqbalance verwalten) |
| RPS/RFS | Software-seitiges Packet Steering |
Ressourcen