Un groupe de chercheurs d'universités allemandes
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.
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).
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.
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