Aller au contenu

irqbalance - Guide de tuning de distribution d'interruptions

irqbalance - Guide de tuning de distribution d’interruptions

irqbalance est un daemon qui distribue les interruptions matériel (IRQs) sur les cores CPU. Par défaut Linux peut router la plupart des interruptions depuis une NIC occupée ou un contrôleur de stockage vers CPU 0, faisant de ce core un goulot tandis que les autres inactivité. irqbalance surveille la charge d’interruption et rééquilibre l’affinité IRQ pour répartir le travail. Inversement, pour les workloads latency-critical avec CPUs hand-pinned, il est souvent délibérément désactivé afin qu’il ne puisse pas déplacer les interruptions sur les cores isolés.

Installation

PlatformCommande
Debian/Ubuntusudo apt install irqbalance
Fedora/RHELsudo dnf install irqbalance
Arch Linuxsudo pacman -S irqbalance
Servicesudo systemctl enable --now irqbalance
Vérifierirqbalance --version

Inspecter les interruptions en premier

CommandeMontre
cat /proc/interruptsComptages d’interruption par-CPU par device
watch -n1 'cat /proc/interrupts'Croissance live (repérer le core chaud)
mpstat -I SUM -P ALL 1Interruptions par CPU par seconde
cat /proc/irq/<N>/smp_affinityAffinité mask pour une IRQ
cat /proc/irq/<N>/smp_affinity_listMême chose, comme une liste de CPU
# Un CPU absorbe-t-il toutes les interruptions NIC ?
watch -n1 "grep -E 'eth0|mlx|ens' /proc/interrupts"

Exécuter le daemon

CommandeDescription
sudo systemctl status irqbalanceVérifier qu’il tourne
sudo irqbalance --foregroundExécuter au premier plan (débogage)
sudo irqbalance --oneshotÉquilibrer une fois, puis sortir
sudo irqbalance --debugDécisions verbeux

Options clés / environnement

ParamètreEffet
IRQBALANCE_BANNED_CPUS=<mask>Ne jamais assigner les IRQs à ces CPUs
--banirq=NExclure une IRQ spécifique de l’équilibrage
--policyscript=PATHScript qui décide la policy par-IRQ
--interval=SECONDSIntervalle de rééquilibrage
`—hintpolicy=exactsubset
--powerthresh=NSeuil de consolidation pour la power-save

La configuration vit habituellement dans /etc/default/irqbalance ou /etc/sysconfig/irqbalance.

# Garder les IRQs loin des cores isolés 8-15 (mask pour les CPUs 8..15)
echo 'IRQBALANCE_BANNED_CPUS=0000ff00' | sudo tee -a /etc/default/irqbalance
sudo systemctl restart irqbalance

Affinité IRQ manuel (quand vous désactivez le daemon)

# Pin IRQ 42 vers CPU 2 (bitmask 0x4)
echo 4 | sudo tee /proc/irq/42/smp_affinity

# Ou par liste de CPU
echo 2 | sudo tee /proc/irq/42/smp_affinity_list
ApprocheUtiliser
irqbalance tournantServeurs généraux, charge variable
irqbalance désactivé + pinning manuelWorkloads basse-latence, NUMA-pinned, RT
CPUs bannisHybride : équilibrer, mais protéger les cores isolés

Pattern latency-critique

# Setup basse-latence typique : arrêter le balancer, pin NIC IRQs près du NUMA node de l'app
sudo systemctl stop irqbalance
sudo systemctl disable irqbalance
# puis définir smp_affinity pour les IRQs de la NIC sur les cores du même NUMA node

Associer à numactl afin que la mémoire de l’application et la gestion des interruptions vivent sur le même NUMA node — la gestion des interruptions cross-node est une source de latence cachée classique.

Vérifier le changement

VérificationCommande
Spread d’interruptionmpstat -I SUM -P ALL 1
Charge softirqtop%si par CPU
Throughput réseausar -n DEV 1
Comptages par-IRQwatch 'cat /proc/interrupts'

Le succès ressemble aux comptages d’interruption croissant régulièrement sur les cores visés (ou concentrés sur exactement les cores que vous avez choisi).

irqbalance vs tuning apparenté

OutilRôle
irqbalanceDistribuer les IRQs sur les CPUs
numactlBind processus CPU/mémoire aux NUMA nodes
cpupowerContrôle fréquence/idle-state
tunedProfils system-wide (peut gérer irqbalance)
RPS/RFSPacket steering côté-software

Ressources