Progression des performances de la table de routage IPv6 sous Linux

Vincent Bernat

Dans un précédent article, j’expliquais comment Linux stockait les routes IPv6. Le graphique suivant montre l’évolution des performances de Linux depuis le noyau 2.6.39 :

Progression des performances de recherche de routes pour IPv6
Temps de recherche de routes IPv6 pour différentes versions du noyau. La recherche est effectuée sur une table de 40 000 routes. Les changements notables sont mis en valeur. Les zones ombragées représentent l'écart absolu médian.

Tous les noyaux sont compilés avec GCC 4.9 (issu de Debian Jessie). Cette version est compatible avec des noyaux antiques ainsi qu’avec les noyaux les plus récents. La configuration du noyau est celle par défaut avec les options CONFIG_SMP, CONFIG_IPV6, CONFIG_IPV6_MULTIPLE_TABLES et CONFIG_IPV6_SUBTREES activées. D’autres options mineures sont activées pour permettre de prendre les mesures.

Il y a trois changements notables :

  • Avec Linux 3.1, Eric Dumazet retarde la copie des métriques pour corriger le partage involontaire entre toutes les entrées du cache (commit 21efcfa0ff27). Chaque route en cache dispose désormais de ces propres métriques, ce qui explique l’impact sur les performances pour les scénarios autres que celui en /128.
  • Avec Linux 3.9, Yoshifuji Hideaki retire l’enchevêtrement entre les entrées de routage et le sous-système des voisins (commit 887c95cc1da5). Cela aurait dû apporter un gain en performance.
  • Avec Linux 4.2, Martin KaFai Lau élimine la création des entrées dans le cache pour la plupart des routes à l’exception des routes dont le PMTU est différent du MTU de l’interface sous-jacente. Les gains proviennent essentiellement du commit 4b32b5ad31a6 et du commit 45e4fd26683c.

Mise à jour à mi-2018#

Voici un graphique concernant des noyaux plus récents. Les mesures ont été effectuées sur un Intel Xeon Gold 6148 tournant à 2,4 GHz, avec GCC 6.3 sur Debian Stretch:

Performance de la table de routage IPv6 sur des noyaux récents
Temps de recherche de routes IPv6 pour différentes versions du noyau. La recherche est effectuée sur une table de 40 000 routes. Les zones ombragées représentent l'écart absolu médian.

Les régressions observées sur les noyaux 4.4.147 et 4.9.119 sont uniquement dues aux contre-mesures pour Spectre1. La petite amélioration des performance pour Linux 4.14 provient de mon commit feca7d8c135b qui optimise le cas sans règles de routage spécifiques. Dans Linux 4.15, l’amélioration la plus notable remonte au commit 66f5d6ce53e6 : Wei Wang remplace le verrou par du RCU et un verrou tournant. Dans Linux 4.18, David Ahern améliore les structures de données utilisées par la table de routage. Le progrès ne se manifeste que modestement sur les courbes mais, par la suite, cela devrait permettre des gains supplémentaires. Il devient aussi possible de comparer plus équitablement IPv4 et IPv6.


  1. Ces noyaux à long terme ont reçu une version simplifiée des contre-mesures présentes dans les noyaux plus récent. Pour IPv4, l’impact est invisible↩︎