irqbalance - Foglio di aiuto per l’ottimizzazione della distribuzione degli interrupt
irqbalance è un daemon che distribuisce gli interrupt hardware (IRQ) sui core della CPU. Per impostazione predefinita Linux può instradare la maggior parte degli interrupt da una NIC o controller di archiviazione occupato alla CPU 0, rendendo quel core un collo di bottiglia mentre gli altri rimangono inattivi. irqbalance monitora il carico di interrupt e riequilibra l”affinità IRQ per distribuire il lavoro. Al contrario, per workload critici di latenza con CPU pin-locked manualmente, viene spesso disabilitato deliberatamente in modo che non possa spostare gli interrupt su core isolati.
Installazione
| Piattaforma | Comando |
|---|
| Debian/Ubuntu | sudo apt install irqbalance |
| Fedora/RHEL | sudo dnf install irqbalance |
| Arch Linux | sudo pacman -S irqbalance |
| Servizio | sudo systemctl enable --now irqbalance |
| Verifica | irqbalance --version |
Ispezione degli interrupt per prima
| Comando | Mostra |
|---|
cat /proc/interrupts | Conteggi di interrupt per CPU per dispositivo |
watch -n1 'cat /proc/interrupts' | Crescita live (spotting il core hot) |
mpstat -I SUM -P ALL 1 | Interrupt per CPU al secondo |
cat /proc/irq/<N>/smp_affinity | Maschera di affinità per un IRQ |
cat /proc/irq/<N>/smp_affinity_list | Stesso, come elenco di CPU |
# Una CPU sta assorbendo tutti gli interrupt NIC?
watch -n1 "grep -E 'eth0|mlx|ens' /proc/interrupts"
Esecuzione del daemon
| Comando | Descrizione |
|---|
sudo systemctl status irqbalance | Controlla che sia in esecuzione |
sudo irqbalance --foreground | Esegui in foreground (debug) |
sudo irqbalance --oneshot | Bilancia una volta, poi esci |
sudo irqbalance --debug | Decisioni verbose |
Opzioni/ambiente chiave
| Impostazione | Effetto |
|---|
IRQBALANCE_BANNED_CPUS=<mask> | Non assegnare mai IRQ a queste CPU |
--banirq=N | Escludi un IRQ specifico dal bilanciamento |
--policyscript=PATH | Script che decide la policy per IRQ |
--interval=SECONDS | Intervallo di riequilibrio |
| `—hintpolicy=exact | subset |
--powerthresh=N | Soglia di consolidamento per risparmio energetico |
La configurazione di solito vive in /etc/default/irqbalance o /etc/sysconfig/irqbalance.
# Mantieni gli IRQ fuori dai core isolati 8-15 (maschera per CPU 8..15)
echo 'IRQBALANCE_BANNED_CPUS=0000ff00' | sudo tee -a /etc/default/irqbalance
sudo systemctl restart irqbalance
Affinità manuale dell”IRQ (quando disabiliti il daemon)
# Fissa l''IRQ 42 alla CPU 2 (bitmask 0x4)
echo 4 | sudo tee /proc/irq/42/smp_affinity
# O per elenco di CPU
echo 2 | sudo tee /proc/irq/42/smp_affinity_list
| Approccio | Usa |
|---|
| irqbalance in esecuzione | Server generici, carico variabile |
| irqbalance disabilitato + pin manuale | Workload a bassa latenza, NUMA-pinned, RT |
| CPU bandite | Ibrido: bilancia, ma proteggi i core isolati |
Schema critico di latenza
# Setup tipico a bassa latenza: ferma il balancer, fissa gli IRQ NIC vicino al nodo NUMA dell''app
sudo systemctl stop irqbalance
sudo systemctl disable irqbalance
# quindi imposta smp_affinity per gli IRQ NIC sui core dello stesso nodo NUMA
Abbinato con numactl in modo che la memoria dell”applicazione e la gestione degli interrupt vivano sullo stesso nodo NUMA — la gestione degli interrupt tra nodi è una classica fonte di latenza nascosta.
Verifica del cambiamento
| Controllo | Comando |
|---|
| Spread interrupt | mpstat -I SUM -P ALL 1 |
| Carico softirq | top → %si per CPU |
| Throughput di rete | sar -n DEV 1 |
| Conteggio per IRQ | watch 'cat /proc/interrupts' |
Il successo si presenta come conteggi di interrupt crescenti uniformemente su core previsti (o concentrati esattamente sui core che hai scelto).
irqbalance vs Tuning correlato
| Strumento | Ruolo |
|---|
| irqbalance | Distribuisci gli IRQ tra CPU |
| numactl | Bind processo CPU/memoria ai nodi NUMA |
| cpupower | Controllo della frequenza/idle-state |
| tuned | Profili a livello di sistema (può gestire irqbalance) |
| RPS/RFS | Steering dei pacchetti dal lato software |
Risorse