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
| Platform | Commande |
|---|
| Debian/Ubuntu | sudo apt install irqbalance |
| Fedora/RHEL | sudo dnf install irqbalance |
| Arch Linux | sudo pacman -S irqbalance |
| Service | sudo systemctl enable --now irqbalance |
| Vérifier | irqbalance --version |
Inspecter les interruptions en premier
| Commande | Montre |
|---|
cat /proc/interrupts | Comptages d’interruption par-CPU par device |
watch -n1 'cat /proc/interrupts' | Croissance live (repérer le core chaud) |
mpstat -I SUM -P ALL 1 | Interruptions par CPU par seconde |
cat /proc/irq/<N>/smp_affinity | Affinité mask pour une IRQ |
cat /proc/irq/<N>/smp_affinity_list | Mê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
| Commande | Description |
|---|
sudo systemctl status irqbalance | Vérifier qu’il tourne |
sudo irqbalance --foreground | Exécuter au premier plan (débogage) |
sudo irqbalance --oneshot | Équilibrer une fois, puis sortir |
sudo irqbalance --debug | Décisions verbeux |
Options clés / environnement
| Paramètre | Effet |
|---|
IRQBALANCE_BANNED_CPUS=<mask> | Ne jamais assigner les IRQs à ces CPUs |
--banirq=N | Exclure une IRQ spécifique de l’équilibrage |
--policyscript=PATH | Script qui décide la policy par-IRQ |
--interval=SECONDS | Intervalle de rééquilibrage |
| `—hintpolicy=exact | subset |
--powerthresh=N | Seuil 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
| Approche | Utiliser |
|---|
| irqbalance tournant | Serveurs généraux, charge variable |
| irqbalance désactivé + pinning manuel | Workloads basse-latence, NUMA-pinned, RT |
| CPUs bannis | Hybride : é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érification | Commande |
|---|
| Spread d’interruption | mpstat -I SUM -P ALL 1 |
| Charge softirq | top → %si par CPU |
| Throughput réseau | sar -n DEV 1 |
| Comptages par-IRQ | watch '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é
| Outil | Rôle |
|---|
| irqbalance | Distribuer les IRQs sur les CPUs |
| numactl | Bind processus CPU/mémoire aux NUMA nodes |
| cpupower | Contrôle fréquence/idle-state |
| tuned | Profils system-wide (peut gérer irqbalance) |
| RPS/RFS | Packet steering côté-software |
Ressources