BGP flapping et saturation IRQ sur edge nodes 100G

Posté par emilie97 le 16/05/2026
RÉSOLU

emilie97

Membre depuis le 24/02/2025

salut. on a des soucis de stabilité BGP (Bird2) sur nos nouveaux edge nodes. dès qu'on dépasse les 40Gbps de trafic entrant les sessions tombent avec un 'Hold timer expired'.

les machines sont des dual EPYC avec des Mellanox ConnectX-6. le cpu est à 10% mais les logs bird sont formels : timeout des keepalives.

Commentaires

grossi

Membre depuis le 14/01/2025

tes keepalives BGP se font drop car ton noyau arrive pas à traiter les paquets de contrôle assez vite. regarde ton /proc/net/softnet_stat.

juliette17

Membre depuis le 05/07/2024

regarde aussi si tes interruptions réseau sont pas toutes sur le core 0. par défaut linux fait souvent de la merde avec l'irqbalance.

emilie97

Membre depuis le 24/02/2025

softnet_stat montre des drops sur la première colonne. et effectivement htop montre un core (cpu 0) à 100% en 'si' alors que les autres glandent.

grossi

Membre depuis le 14/01/2025

c'est ton problème. ksoftirqd/0 est saturé. il traite tous les paquets et bird a pas de slot pour envoyer ses keepalives. faut virer irqbalance et pinner tes queues manuellement.

juliette17

Membre depuis le 05/07/2024

t'as combien de queues sur tes NIC ?

ethtool -l eth0

emilie97

Membre depuis le 24/02/2025

j'ai 32 queues. mais elles semblent toutes mapper sur les cores 0-31 du premier socket. voilà le retour d'ethtool :

Combined: 32

grossi

Membre depuis le 14/01/2025

faut que tu fasses du RSS (Receive Side Scaling) propre. et surtout bind tes process critiques comme bird sur des cores qui font pas d'irq réseau.

emilie97

Membre depuis le 24/02/2025

je viens de tester un script de pinning manuel des irq sur les cores 1-31. j'ai laissé le core 0 et le core 32 libres.

for i in {0..31}; do
  echo $i > /proc/irq/$(cat /proc/interrupts | grep "eth0-$i" | cut -d: -f1 | tr -d ' ')/smp_affinity_list
done

juliette17

Membre depuis le 05/07/2024

mieux. mais bird peut toujours se faire squeeze. utilise isolcpus ou cpuset pour dédier des cores au control plane.

grossi

Membre depuis le 14/01/2025

vérifie aussi ton buffer ring. si tu prends des bursts à 100G les réglages par défaut sont trop faibles.

ethtool -g eth0

emilie97

Membre depuis le 24/02/2025

les rings étaient à 1024. je les ai montés à 4096. le nombre de drops dans softnet_stat a l'air de diminuer mais j'ai encore des 'si' élevés sur les cores de tête.

juliette17

Membre depuis le 05/07/2024

active le RFS (Receive Flow Steering) pour que le traitement remonte au core où l'appli tourne. ça aide pour bird si le socket tcp est bien géré.

grossi

Membre depuis le 14/01/2025

et augmente le net.core.netdev_budget. par défaut c'est 300. passe le à 600 ou 1000 pour que le noyau traite plus de paquets par cycle d'interruption.

emilie97

Membre depuis le 24/02/2025

j'ai appliqué ça :

sysctl -w net.core.netdev_budget=1000
sysctl -w net.core.netdev_max_backlog=5000

emilie97

Membre depuis le 24/02/2025

depuis les changements sur le budget et le pinning manuel des queues sur les deux sockets les sessions BGP bougent plus. même à 60Gbps constant.

le core 0 respire enfin. le trafic est bien étalé. merci pour le debug bas niveau c'était bien l'irq steering qui foutait la zone sur le control plane.

emilie97

Membre depuis le 24/02/2025

je vais automatiser ça avec un script udev pour les prochains nodes. sujet clos.

Laisser une réponse

Vous devez être connecté pour poster un message !

Rejoindre la communauté

Recevoir les derniers articles gratuitement en créant un compte !

S'inscrire