Salta ai contenuti

irqbalance - Foglio di aiuto per l'ottimizzazione della distribuzione degli interrupt

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

PiattaformaComando
Debian/Ubuntusudo apt install irqbalance
Fedora/RHELsudo dnf install irqbalance
Arch Linuxsudo pacman -S irqbalance
Serviziosudo systemctl enable --now irqbalance
Verificairqbalance --version

Ispezione degli interrupt per prima

ComandoMostra
cat /proc/interruptsConteggi di interrupt per CPU per dispositivo
watch -n1 'cat /proc/interrupts'Crescita live (spotting il core hot)
mpstat -I SUM -P ALL 1Interrupt per CPU al secondo
cat /proc/irq/<N>/smp_affinityMaschera di affinità per un IRQ
cat /proc/irq/<N>/smp_affinity_listStesso, come elenco di CPU
# Una CPU sta assorbendo tutti gli interrupt NIC?
watch -n1 "grep -E 'eth0|mlx|ens' /proc/interrupts"

Esecuzione del daemon

ComandoDescrizione
sudo systemctl status irqbalanceControlla che sia in esecuzione
sudo irqbalance --foregroundEsegui in foreground (debug)
sudo irqbalance --oneshotBilancia una volta, poi esci
sudo irqbalance --debugDecisioni verbose

Opzioni/ambiente chiave

ImpostazioneEffetto
IRQBALANCE_BANNED_CPUS=<mask>Non assegnare mai IRQ a queste CPU
--banirq=NEscludi un IRQ specifico dal bilanciamento
--policyscript=PATHScript che decide la policy per IRQ
--interval=SECONDSIntervallo di riequilibrio
`—hintpolicy=exactsubset
--powerthresh=NSoglia 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
ApproccioUsa
irqbalance in esecuzioneServer generici, carico variabile
irqbalance disabilitato + pin manualeWorkload a bassa latenza, NUMA-pinned, RT
CPU banditeIbrido: 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

ControlloComando
Spread interruptmpstat -I SUM -P ALL 1
Carico softirqtop%si per CPU
Throughput di retesar -n DEV 1
Conteggio per IRQwatch '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

StrumentoRuolo
irqbalanceDistribuisci gli IRQ tra CPU
numactlBind processo CPU/memoria ai nodi NUMA
cpupowerControllo della frequenza/idle-state
tunedProfili a livello di sistema (può gestire irqbalance)
RPS/RFSSteering dei pacchetti dal lato software

Risorse