irqbalance - Ajuste de Distribuição de Interrupção - Guia de Referência
irqbalance é um daemon que distribui interrupções de hardware (IRQs) entre núcleos de CPU. Por padrão, Linux pode encaminhar a maioria de interrupções de uma NIC ou controlador de armazenamento ocupado para CPU 0, tornando esse núcleo um gargalo enquanto outros ficam ociosos. irqbalance monitora carga de interrupção e rebalanceia afinidade IRQ para espalhar o trabalho. Inversamente, para cargas de trabalho críticas de latência com CPUs hand-pinned, frequentemente é deliberadamente desabilitado para que não possa mover interrupções para núcleos isolados.
Instalação
| Plataforma | Comando |
|---|
| Debian/Ubuntu | sudo apt install irqbalance |
| Fedora/RHEL | sudo dnf install irqbalance |
| Arch Linux | sudo pacman -S irqbalance |
| Serviço | sudo systemctl enable --now irqbalance |
| Verificar | irqbalance --version |
Inspecionando Interrupções Primeiro
| Comando | Mostra |
|---|
cat /proc/interrupts | Contagens de interrupção por CPU por dispositivo |
watch -n1 'cat /proc/interrupts' | Crescimento ao vivo (spot no núcleo quente) |
mpstat -I SUM -P ALL 1 | Interrupções por CPU por segundo |
cat /proc/irq/<N>/smp_affinity | Máscara de afinidade para um IRQ |
cat /proc/irq/<N>/smp_affinity_list | Mesmo, como lista de CPU |
# Um CPU está absorvendo todas as interrupções de NIC?
watch -n1 "grep -E 'eth0|mlx|ens' /proc/interrupts"
Executando o Daemon
| Comando | Descrição |
|---|
sudo systemctl status irqbalance | Verificar que está executando |
sudo irqbalance --foreground | Executar em foreground (debug) |
sudo irqbalance --oneshot | Balancear uma vez, depois sair |
sudo irqbalance --debug | Decisões verbose |
Opções Principais / Ambiente
| Configuração | Efeito |
|---|
IRQBALANCE_BANNED_CPUS=<mask> | Nunca atribuir IRQs a essas CPUs |
--banirq=N | Excluir um IRQ específico do balanceamento |
--policyscript=PATH | Script que decide política por IRQ |
--interval=SECONDS | Intervalo de rebalanceamento |
| `—hintpolicy=exact | subset |
--powerthresh=N | Threshold de consolidação de poder-save |
Configuração usualmente vive em /etc/default/irqbalance ou /etc/sysconfig/irqbalance.
# Manter IRQs longe de núcleos isolados 8-15 (máscara para CPUs 8..15)
echo 'IRQBALANCE_BANNED_CPUS=0000ff00' | sudo tee -a /etc/default/irqbalance
sudo systemctl restart irqbalance
Afinidade IRQ Manual (quando você desabilita o daemon)
# Pinar IRQ 42 para CPU 2 (bitmask 0x4)
echo 4 | sudo tee /proc/irq/42/smp_affinity
# Ou por lista de CPU
echo 2 | sudo tee /proc/irq/42/smp_affinity_list
| Abordagem | Use |
|---|
| irqbalance em execução | Servidores gerais, carga variável |
| irqbalance desabilitado + pinning manual | Carga de trabalho com baixa-latência, NUMA-pinned, RT |
| CPUs banidas | Híbrido: balancear, mas proteger núcleos isolados |
Padrão Crítico de Latência
# Setup de baixa-latência típico: parar o balancer, pinar IRQs de NIC perto do NUMA node da app
sudo systemctl stop irqbalance
sudo systemctl disable irqbalance
# depois definir smp_affinity para os IRQs da NIC em núcleos no mesmo NUMA node
Combine com numactl para que memória da aplicação e manipulação de interrupção vivam no mesmo NUMA node — manipulação de interrupção entre nodes é uma fonte de latência oculta clássica.
Verificando a Mudança
| Verificação | Comando |
|---|
| Spread de interrupção | mpstat -I SUM -P ALL 1 |
| Carga de softirq | top → %si por CPU |
| Throughput de rede | sar -n DEV 1 |
| Contagens por IRQ | watch 'cat /proc/interrupts' |
Sucesso se parece com contagens de interrupção crescendo uniformemente entre núcleos pretendidos (ou concentrado nos exatos núcleos que você escolheu).
irqbalance vs Ajuste Relacionado
| Ferramenta | Papel |
|---|
| irqbalance | Distribuir IRQs entre CPUs |
| numactl | Vincular processo CPU/memória a nós NUMA |
| cpupower | Controle de frequência/estado-ocioso |
| tuned | Perfis em toda-sistema (pode gerenciar irqbalance) |
| RPS/RFS | Steering de pacote lado-software |
Recursos