C'est un grand classique ça les drivers et le XDP. Mellanox a des spécificités. T'as quelle version du kernel ? Et du iproute2 ? Des fois c'est juste la toolchain qui est pas à jour
Regarde ton dmesg pour des erreurs liées à XDP ou mlx5_core. Des fois le driver signale un souci au chargement du programme ou pendant son exécution. Et vérifie le `tc -s qdisc show dev
Kernel 5.15.x et iproute2 5.15.0. Le dmesg est propre, rien d'anormal. `tc -s qdisc` montre des drops sur l'interface Mellanox mais pas l'Intel.
C'est pas une question d'offloading activé sur la Mellanox qui interfère ? genre TSO GSO LRO ? Des fois ça peut poser problème avec XDP si le hardware modifie les paquets avant ton prog
Ouais désactive tout ce qui est offload via `ethtool -K
j'ai désactivé tous les offloads avec ethtool, rebooté et retenté. toujours les 10% de drops sur la Mellanox. Rien côté cpu utilisation non plus.
Hmmm ok. Et la taille de tes paquets ? XDP supporte pas les fragments IPv4 ou les paquets avec des options IP complexes nativement. C'est ptete pas ton cas si ton prog est simple mais on sait jamais
Si tes paquets sont fragmentés le driver XDP peut refuser de les passer à ton programme. Il faut vérifier ton trafic si tu peux avec wireshark ou tcpdump et chercher les flags de fragmentation.
mes paquets sont des paquets TCP/IP standard pas de fragmentation. taille max 1500 bytes.
T'as vérifié si le programme est bien attaché en mode "driver" et pas "generic" sur les deux cartes ? Le `ip link show dev
oui oui c'est bien en mode driver pour les deux.
Y a eu des soucis spécifiques avec mlx5_core et XDP sur certaines versions de firmware Mellanox. T'as le dernier firmware à jour sur ta carte ? Ça peut être une incompatibilité basse couche
ah pas bête j'ai pas checké le firmware de la ConnectX-5. Je vais voir ça.
Et aussi, t'as regardé les métriques XDP de la carte via `ip -d link show dev
je viens de vérifier les métriques `ip -d link show`, j'ai des `bad_headroom` qui augmentent en même temps que mes drops. c'est quoi ça ?
AHA ! `bad_headroom` c'est quand ton programme XDP essaie de faire un `xdp_adjust_headroom` ou `xdp_adjust_tailroom` et qu'il n'y a pas assez de place dans le buffer du driver. Ou que ton programme accède à des données hors des limites du paquet.
Ton programme fait un `XDP_PASS` donc il ne devrait pas toucher à la headroom. Mais si l'initialisation du buffer par le driver Mellanox est plus petite que sur Intel, ton simple `data + sizeof(struct ethhdr) > data_end` peut être faux si `data` est déjà trop proche du début du buffer et que le driver n'alloue pas assez de `headroom` pour les opérations internes ou des métadonnées
ok donc le driver Mellanox alloue moins de headroom que le driver Intel par défaut. mon programme accède au début du paquet donc y a pas de souci de taille. C'est juste que le driver lui-même pourrait avoir besoin de plus de headroom pour ses propres opérations.
exact. essaye de remonter la valeur de `XDP_PACKET_HEADROOM` si ton code C le permet, ou de recompiler le kernel avec une valeur plus grande pour cette constante. C'est un hack mais ça confirme le problème
j'ai recompilé le programme XDP avec un `xdp_adjust_headroom(ctx, 64);` au début pour donner 64 bytes de plus et les drops ont disparu ! c'était bien un problème de headroom par défaut du driver Mellanox pour XDP. merci les gars ça m'a sauvé !
Vous devez être connecté pour poster un message !
Recevoir les derniers articles gratuitement en créant un compte !
S'inscrire
epotier
Membre depuis le 20/02/2020
actif
salut à tous, j'ai un programme xdp en mode natif qui droppe des paquets sur une carte mellanox connectx-5 (driver mlx5_core) alors qu'il marche nickel sur une intel i210 (driver igb). mon programme est tout simple il fait juste un `xdp_pass` après quelques checks. sur la mellanox j'ai genre 10% de drops. la carte est en mode `driver` pas `generic`. je comprends pas pourquoi.