Comparaison de la performance du pilote réseau dans 10 langages de programmation

Un groupe de chercheurs provenant d'universités allemandes a publié des résultats a mené une expérience, au cours de laquelle dix variantes d'un pilote standard pour cartes réseau Intel Ixgbe (X5xx) ont été développées dans différents langages de programmation. Le pilote fonctionne en espace utilisateur et est implémenté en C, Rust, Go, C#, Java, OCaml, Haskell, Swift, JavaScript et Python. Lors de la rédaction du code, l'accent a été mis sur l'atteinte de la performance maximale en tenant compte des spécificités de chaque langage. En termes de fonctionnalité, toutes les variantes sont identiques et contiennent environ 1000 lignes de code. Les développements du projet sont distribués sous licence BSD.

La variante du pilote en Rust s'est révélée très proche en performance du pilote de référence en C. Lors d'une charge avec l'envoi simultané de blocs de 32 paquets, le pilote Rust accusait légèrement du retard, mais lors de tests avec plus de 32 paquets dans le bloc, il ne différait pratiquement pas du pilote en C et démontrait une performance de traitement de 28 millions de paquets par seconde sur un serveur équipé d'un CPU Xeon E3-1230 v2 à 3,3 GHz.

Comparaison de la performance du pilote réseau dans 10 langages de programmation

La prochaine position en termes de performance a été occupée par les pilotes en Go et C#, qui ont montré des résultats assez proches (le pilote en Go gagnait lors des tests avec des blocs contenant jusqu'à 16 paquets, mais commençait à perdre lors des tests avec plus de 16 paquets dans le bloc). Lors de tests avec des blocs de 256 paquets, le pic de performance du pilote en C# atteignait environ 28 millions de paquets par seconde, tandis que le pilote en Go atteignait environ 25 millions de paquets par seconde.

Suivaient ensuite, avec des résultats relativement proches, les pilotes en
Java, OCaml et Haskell, qui étaient déjà nettement à la traîne par rapport aux options précédemment examinées et n'ont pas réussi à dépasser la barre des 12 millions de paquets par seconde. Les pilotes en Swift et JavaScript ont montré un retard encore plus marqué, ne pouvant traiter des flux qu'à un niveau de 5 millions de paquets par seconde.

Clôturant le classement, le pilote en Python a pu traiter seulement 0,14 million de paquets par seconde. L'implémentation en Python a été utilisée pour évaluer la vitesse de fonctionnement des interprètes sans JIT et sans optimisations spécifiques (le code a été exécuté avec CPython 3.7 et n'était pas compatible avec PyPy, mais il est noté que l'optimisation des structures de données pourrait augmenter la performance d'environ 10 fois).

Des tests supplémentaires sur les délais ont également été effectués, montrant l'efficacité de la mise en mémoire tampon et l'impact du ramasse-miettes. Lors des tests, le délai après le redirigement de chaque paquet par le pilote était mesuré par rapport à un temps d'envoi connu avec précision. Les pilotes en C et Rust sont restés les leaders, avec des résultats pratiquement indistinguables pour un flux de 1 million de paquets par seconde (environ 20 µs). Le pilote en Go a également bien performé, juste un peu derrière les leaders, maintenant également un délai autour de 20 µs. Le pilote en C# a montré des délais d'environ 50 µs.
Les plus grands délais ont été observés avec les pilotes en JavaScript et Java (délais supérieurs à 300 µs).

Comparaison de la performance du pilote réseau dans 10 langages de programmation

Cette recherche a été réalisée afin d'évaluer la possibilité de développer des pilotes et des composants du système d'exploitation dans des langages de niveau supérieur à C. Actuellement, 39 des 40 problèmes de gestion de la mémoire sous Linux sont liés aux pilotes, donc les questions d'application d'un langage plus sûr et de déplacement des pilotes de noyau vers l'espace utilisateur restent d'actualité. Les fabricants expérimentent déjà activement dans ce domaine (par exemple, Google a développé une pile TCP pour le système d'exploitation Fuchsia en Go, la société CloudFlare a créé a implémenté le protocole QUIC en Rust, et Apple a déplacé sa pile TCP sur les appareils mobiles dans l'espace utilisateur).

Dans le cadre de cette recherche, il a été conclu que le langage Rust est le meilleur candidat pour le développement de pilotes. Les fonctionnalités offertes par Rust permettent de se débarrasser des problèmes liés à la gestion de la mémoire à bas niveau, à un coût de réduction de performance d'environ 2 à 10% par rapport aux pilotes en C. Les langages Go et C# sont également jugés adaptés à la création de composants système, dans des situations où des délais au niveau des fractions de milliseconde, causés par le ramasse-miettes, sont acceptables.

Source : opennet.ru

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster