Comparaison des performances des pilotes réseau dans les versions en 10 langages de programmation

Un groupe de chercheurs d'universités allemandes опубликовала résultats l'expérience, au cours de laquelle 10 versions d'un pilote standard pour cartes réseau Intel Ixgbe (X10xx) 5 gigabits ont été développées dans différents langages de programmation. Le pilote s'exécute dans l'espace utilisateur et est implémenté en C, Rust, Go, C#, Java, OCaml, Haskell, Swift, JavaScript et Python. Lors de l’écriture du code, l’objectif principal était d’obtenir les meilleures performances possibles, en tenant compte des caractéristiques de chaque langage. Toutes les options ont des fonctionnalités identiques et comprennent environ 1000 XNUMX lignes de code. Développements de projets propagé sous licence BSD.

La version Rust du pilote s'est avérée très proche en termes de performances du pilote de référence en langage C. Sous une charge avec envoi simultané de blocs de 32 paquets, le pilote Rust était légèrement en retard, mais dans les tests avec plus de 32 paquets par bloc, la vitesse n'était pratiquement pas différente de celle du pilote C et démontrait des performances au niveau de traitement de 28 millions. paquets par seconde sur un serveur équipé d'un processeur Xeon E3-1230 v2 3.3 GHz.

Comparaison des performances des pilotes réseau dans les versions en 10 langages de programmation

Le créneau suivant en termes de performances était occupé par les pilotes des langages Go et C#, qui ont montré des résultats assez proches (le pilote Go a gagné dans les tests avec des blocs allant jusqu'à 16 paquets, et a commencé à perdre légèrement dans les tests avec plus de 16 paquets dans un bloc). Avec 256 paquets par bloc, les performances maximales du pilote C# étaient d'environ 28 millions de paquets par seconde, et celles du pilote Go d'environ 25 millions de paquets par seconde.

Ensuite, avec des résultats assez serrés, les facteurs déterminants
Java, OCaml et Haskell, qui étaient déjà sensiblement en retard par rapport aux options précédemment envisagées et n'ont pas pu surmonter la barre des 12 millions de paquets par seconde. Les pilotes Swift et JavaScript ont montré un retard encore plus important, étant capables de traiter des flux au niveau de 5 millions de paquets par seconde.

Le pilote Python vient compléter le classement, capable de traiter seulement 0.14 million de paquets par seconde. L'implémentation Python a été utilisée pour évaluer la vitesse des interpréteurs 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 à noter que l'optimisation des structures de stockage de données pourrait améliorer les performances d'environ 10 fois ).

De plus, des tests de latence ont été effectués pour montrer l’efficacité de la mise en mémoire tampon et l’impact du garbage collector. Les tests ont mesuré la latence après le transfert de chaque paquet par le pilote par rapport à l'heure exacte à laquelle il a été envoyé. Les leaders étaient toujours les pilotes C et Rust, dont les résultats étaient pratiquement indiscernables pour un flux de 1 million de paquets par seconde (environ 20 µs). Le pilote Go s'est bien comporté, n'étant que légèrement en retard sur les leaders et restant également au niveau des 20 µs. Le pilote C# a montré des retards d'environ 50 µs.
Les retards les plus longs ont été enregistrés par les pilotes JavaScript et Java (latences supérieures à 300 µs).

Comparaison des performances des pilotes réseau dans les versions en 10 langages de programmation

L'étude a été menée pour évaluer la possibilité de développer des pilotes et des composants du système d'exploitation dans des langages de niveau supérieur à celui du C. Actuellement, 39 problèmes de mémoire sur 40 sous Linux sont liés aux pilotes, d'où les problèmes liés à l'utilisation d'un langage plus sécurisé et au déplacement des pilotes hors du noyau vers l'espace utilisateur. rester pertinent et les constructeurs expérimentent déjà activement dans ce sens (par exemple, Google a développé une pile TCP pour l'OS Fuchsia en langage Go, société CloudFlare a créé implémentation du protocole QUIC dans Rust, Apple a déplacé la pile TCP sur les appareils mobiles vers l'espace utilisateur).

Au cours des travaux, il a été conclu que le langage Rust est le meilleur candidat pour le développement de pilotes. Les capacités de Rust éliminent les problèmes associés à la gestion de la mémoire de bas niveau au prix d'une perte de performances d'environ 2 à 10 % par rapport aux pilotes C. Go et C# sont également considérés comme adaptés à la création de composants système dans des situations où une latence inférieure à la milliseconde causée par le garbage collection est acceptable.

Source: opennet.ru

Ajouter un commentaire