← retour aux snippets

IRQ affinity: pinner des IRQ réseau sur des CPUs

Affecter des IRQ à des CPUs spécifiques pour réduire la contention et améliorer la latence.

bash kernel #irq#affinity#nic

objectif

Limiter la migration d’IRQ et rapprocher traitement IRQ et queues NIC.

code minimal

# lister les IRQ liées à l'interface (ex: eth0)
grep eth0 /proc/interrupts

# pinner une IRQ (ex: 75) sur CPU 2 (mask 0x4)
echo 4 | sudo tee /proc/irq/75/smp_affinity

utilisation

# script rapide pour pinner séquentiellement les IRQ d'une NIC
NIC=eth0; cpus=(1 2 3 4); i=0
for irq in $(grep "$NIC" /proc/interrupts | awk '{print $1}' | tr -d ':'); do
  cpu=${cpus[i % ${#cpus[@]}]}
  mask=$((1<<cpu))
  printf "%x
" "$mask" | sudo tee /proc/irq/$irq/smp_affinity >/dev/null
  i=$((i+1))
done

variante(s) utile(s)

# désactiver irqbalance si vous gérez à la main
sudo systemctl stop irqbalance

notes

  • vérifiez l’effet via /proc/interrupts et perf/netstat.
  • attention aux systèmes NUMA: regroupez IRQ et CPU par nœud.