irqbalance - Ajuste de distribución de interrupciones
irqbalance es un daemon que distribuye interrupciones de hardware (IRQs) entre núcleos de CPU. Por defecto Linux puede enrutar la mayoría de interrupciones de una NIC o controlador de almacenamiento ocupado a CPU 0, haciendo ese núcleo un cuello de botella mientras otros están inactivos. irqbalance monitorea carga de interrupción y rebalancea afinidad de IRQ para extender el trabajo. Contrariamente, para cargas de trabajo críticas de latencia con CPUs fijadas manualmente, a menudo deliberadamente deshabilitado para que no pueda mover interrupciones a núcleos aislados.
Instalación
| Plataforma | Comando |
|---|
| Debian/Ubuntu | sudo apt install irqbalance |
| Fedora/RHEL | sudo dnf install irqbalance |
| Arch Linux | sudo pacman -S irqbalance |
| Servicio | sudo systemctl enable --now irqbalance |
| Verificar | irqbalance --version |
Inspeccionar interrupciones primero
| Comando | Muestra |
|---|
cat /proc/interrupts | Conteos de interrupción por CPU por dispositivo |
watch -n1 'cat /proc/interrupts' | Crecimiento en vivo (localiza el núcleo caliente) |
mpstat -I SUM -P ALL 1 | Interrupciones por CPU por segundo |
cat /proc/irq/<N>/smp_affinity | Máscara de afinidad para una IRQ |
cat /proc/irq/<N>/smp_affinity_list | Mismo, como lista de CPU |
# ¿Un CPU está absorbiendo todas las interrupciones de NIC?
watch -n1 "grep -E 'eth0|mlx|ens' /proc/interrupts"
Ejecutar el daemon
| Comando | Descripción |
|---|
sudo systemctl status irqbalance | Verifica que esté ejecutándose |
sudo irqbalance --foreground | Ejecuta en primer plano (depuración) |
sudo irqbalance --oneshot | Balancea una vez, luego sale |
sudo irqbalance --debug | Decisiones detalladas |
Opciones clave / Ambiente
| Configuración | Efecto |
|---|
IRQBALANCE_BANNED_CPUS=<mask> | Nunca asignes IRQs a estos CPUs |
--banirq=N | Excluye una IRQ específica del balanceo |
--policyscript=PATH | Script que decide política por IRQ |
--interval=SECONDS | Intervalo de rebalanceo |
| `—hintpolicy=exact | subset |
--powerthresh=N | Umbral de consolidación de ahorro de energía |
La configuración usualmente vive en /etc/default/irqbalance o /etc/sysconfig/irqbalance.
# Mantén IRQs fuera de núcleos aislados 8-15 (máscara para CPUs 8..15)
echo 'IRQBALANCE_BANNED_CPUS=0000ff00' | sudo tee -a /etc/default/irqbalance
sudo systemctl restart irqbalance
Afinidad de IRQ manual (cuando deshabilitas el daemon)
# Fija IRQ 42 a CPU 2 (máscara de bits 0x4)
echo 4 | sudo tee /proc/irq/42/smp_affinity
# O por lista de CPU
echo 2 | sudo tee /proc/irq/42/smp_affinity_list
| Enfoque | Usar |
|---|
| irqbalance ejecutándose | Servidores generales, carga variable |
| irqbalance deshabilitado + fijación manual | Carga baja de latencia, NUMA-fijada, cargas de trabajo RT |
| CPUs prohibidos | Híbrido: balancea, pero protege núcleos aislados |
Patrón crítico de latencia
# Configuración típica de baja latencia: detén el balanceador, fija IRQs de NIC cerca del nodo NUMA de la app
sudo systemctl stop irqbalance
sudo systemctl disable irqbalance
# luego establece smp_affinity para las IRQs de NIC a núcleos en el mismo nodo NUMA
Empareja con numactl para que la memoria de la aplicación y el manejo de interrupciones vivan en el mismo nodo NUMA — el manejo de interrupción entre nodos es una fuente de latencia oculta clásica.
Verificar el cambio
| Verificación | Comando |
|---|
| Dispersión de interrupción | mpstat -I SUM -P ALL 1 |
| Carga de softirq | top → %si por CPU |
| Rendimiento de red | sar -n DEV 1 |
| Conteos por IRQ | watch 'cat /proc/interrupts' |
El éxito se parece a conteos de interrupción creciendo uniformemente entre núcleos previstos (o concentrados en exactamente los núcleos que elegiste).
irqbalance vs ajuste relacionado
| Herramienta | Rol |
|---|
| irqbalance | Distribuye IRQs entre CPUs |
| numactl | Vincula proceso CPU/memoria a nodos NUMA |
| cpupower | Control de frecuencia/estado-ocioso |
| tuned | Perfiles a nivel de sistema (puede gestionar irqbalance) |
| RPS/RFS | Direccionamiento de paquete en el lado del software |
Recursos