Comparació del rendiment del controlador de xarxa en 10 llenguatges de programació

Un grup d'investigadors d'universitats alemanyes publicat troballes experiment, durant el qual es van desenvolupar 10 variants d'un controlador típic per a targetes de xarxa Intel Ixgbe (X10xx) de 5 gigabits en diferents llenguatges de programació. El controlador s'executa a l'espai d'usuari i s'implementa en C, Rust, Go, C#, Java, OCaml, Haskell, Swift, JavaScript i Python. A l'hora d'escriure el codi, es va centrar en aconseguir el màxim rendiment possible, tenint en compte les característiques de cada llenguatge. Pel que fa a la funcionalitat, totes les opcions són idèntiques i consten d'aproximadament 1000 línies de codi. Assoliments del projecte propagació sota la llicència BSD.

La versió Rust del controlador era molt semblant en rendiment al controlador C de referència. Amb una càrrega amb un sol enviament de blocs de 32 paquets, el controlador Rust es va endarrerir una mica, però en proves amb més de 32 paquets per bloc, pràcticament no es diferenciava en velocitat del controlador C i va demostrar un rendiment a nivell de processament. 28 milions de paquets per segon en un servidor amb una CPU Xeon E3-1230 v2 3.3 GHz.

Comparació del rendiment del controlador de xarxa en 10 llenguatges de programació

El següent nínxol en termes de rendiment el van ocupar els controladors Go i C#, que van mostrar resultats força ajustats (el pilot de Go va guanyar en proves amb blocs que incloïen fins a 16 paquets, i va començar a perdre lleugerament en proves amb més de 16 paquets en un bloc). Amb 256 paquets per bloc, el rendiment màxim per al controlador C# va ser d'aproximadament 28 Mpps, i per als controladors Go, aproximadament 25 Mpps.

A continuació, amb resultats força propers, seguit dels conductors per
Java, OCaml i Haskell, que ja estaven notablement endarrerits de les opcions considerades anteriorment i no van poder superar la barra dels 12 milions de paquets per segon. Els controladors basats en Swift i JavaScript van mostrar un retard encara més gran, que van poder processar fluxos a un nivell de 5 milions de paquets per segon.

El controlador en llenguatge Python va tancar la qualificació, que només va poder processar 0.14 milions de paquets per segon. La implementació de Python es va utilitzar per avaluar la velocitat dels intèrprets sense JIT i sense optimitzacions específiques (el codi es va executar amb CPython 3.7 i no era compatible amb PyPy, però s'observa que l'optimització de les estructures de dades podria millorar el rendiment unes 10 vegades).

Addicionalment, es van realitzar proves de latència, que van mostrar l'efectivitat de l'amortització i l'impacte del col·lector d'escombraries. La prova va mesurar la latència després que cada paquet fos redirigit pel controlador, en comparació amb un temps d'enviament conegut. Els líders encara eren els controladors C i Rust, els resultats dels quals eren gairebé indistinguibles per a un flux d'1 milió de paquets per segon (uns 20 µs). El conductor en l'idioma Go va tenir un bon rendiment, que va quedar lleugerament per darrere dels líders i també es va mantenir al nivell de 20 µs. El controlador C# va mostrar retards d'uns 50 µs.
Els controladors basats en JavaScript i Java van mostrar els retards més grans (retards superiors a 300 µs).

Comparació del rendiment del controlador de xarxa en 10 llenguatges de programació

L'estudi es va dur a terme per tal d'avaluar la possibilitat de desenvolupar controladors i components del sistema operatiu en llenguatges de nivell superior al C. Actualment, 39 de cada 40 problemes de memòria de Linux estan relacionats amb els controladors, de manera que els problemes d'adoptar un llenguatge més segur i moure els controladors fora del nucli a l'espai d'usuari. segueixen sent rellevants i els fabricants ja estan experimentant activament en aquesta direcció (per exemple, Google ha desenvolupat una pila TCP per al sistema operatiu Fucsia a Go, CloudFlare creat implementació del protocol QUIC a Rust, Apple va traslladar la pila TCP als dispositius mòbils a l'espai d'usuari).

En el transcurs del treball realitzat, es va concloure que el llenguatge Rust és el millor candidat per al desenvolupament del conductor. Les funcions proporcionades per Rust us permeten desfer-vos dels problemes que sorgeixen a causa del maneig de la memòria de baix nivell, a costa d'una penalització de rendiment d'uns 2%-10% en comparació amb els controladors de llenguatge C. També s'ha trobat que Go i C# són adequats per construir components del sistema en situacions en què la latència inferior al mil·lisegon causada pel col·lector d'escombraries és acceptable.

Font: opennet.ru

Afegeix comentari