Sammenligning av nettverksdriverytelse i versjoner på 10 programmeringsspråk

En gruppe forskere fra tyske universiteter опубликовала funn eksperiment, hvor 10 versjoner av en standard driver for 10-gigabit Intel Ixgbe (X5xx) nettverkskort ble utviklet på forskjellige programmeringsspråk. Driveren kjører i brukerrom og er implementert i C, Rust, Go, C#, Java, OCaml, Haskell, Swift, JavaScript og Python. Ved skriving av kode var hovedfokuset på å oppnå best mulig ytelse, tatt i betraktning egenskapene til hvert språk. Alle alternativer er identiske i funksjonalitet og består av ca. 1000 linjer med kode. Prosjektutvikling spre under BSD-lisens.

Rust-versjonen av driveren viste seg å være svært nær referansedriveren på C-språket i ytelse. Under en belastning med samtidig sending av blokker på 32 pakker var Rust-sjåføren litt bak, men i tester med mer enn 32 pakker per blokk var hastigheten praktisk talt ikke forskjellig fra C-driveren og demonstrerte ytelse på behandlingsnivået 28 millioner pakker per sekund på en server med en Xeon CPU E3-1230 v2 3.3 GHz.

Sammenligning av nettverksdriverytelse i versjoner på 10 programmeringsspråk

Den neste nisjen når det gjelder ytelse ble okkupert av drivere i Go- og C#-språkene, som viste ganske nære resultater (Go-driveren vant i tester med blokker på opptil 16 pakker, og begynte å tape litt i tester med mer enn 16 pakker i en blokk). Med 256 pakker per blokk var toppytelsen til C#-driveren omtrent 28 millioner pakker per sekund, og Go-driveren var omtrent 25 millioner pakker per sekund.

Neste, med ganske nære resultater, var sjåførene for
Java, OCaml og Haskell, som allerede lå merkbart etter de tidligere vurderte alternativene og ikke kunne overvinne 12 millioner pakker per sekund bar. Swift- og JavaScript-drivere viste en enda større etterslep, og kunne behandle strømmer på nivået 5 millioner pakker per sekund.

Topprangeringen ble fullført av Python-driveren, som var i stand til å behandle bare 0.14 millioner pakker per sekund. Python-implementeringen ble brukt til å evaluere hastigheten til tolkene uten JIT og uten spesifikke optimaliseringer (koden ble utført med CPython 3.7 og var ikke kompatibel med PyPy, men det bemerkes at optimalisering av datalagringsstrukturer kan forbedre ytelsen med omtrent 10 ganger ).

I tillegg ble det utført latenstidstester for å vise effektiviteten av buffering og påvirkningen av søppeloppsamleren. Testingen målte latensen etter at hver pakke ble videresendt av sjåføren sammenlignet med det eksakte tidspunktet den ble sendt. Lederne var fortsatt C- og Rust-driverne, hvis resultater var praktisk talt umulige å skille for en flyt på 1 million pakker per sekund (omtrent 20 µs). Go-føreren presterte bra, bare litt bak lederne og holdt seg også på nivået 20 µs. C#-driveren viste forsinkelser på omtrent 50 µs.
De lengste forsinkelsene ble vist av JavaScript- og Java-drivere (forsinkelser på mer enn 300 µs).

Sammenligning av nettverksdriverytelse i versjoner på 10 programmeringsspråk

Studien ble utført for å vurdere muligheten for å utvikle drivere og operativsystemkomponenter på overordnede språk enn C. For øyeblikket er 39 av 40 minneproblemer i Linux relatert til drivere, så problemene med å bruke et sikrere språk og flytte drivere ut av kjernen og inn i brukerområdet forbli relevant og produsenter eksperimenterer allerede aktivt i denne retningen (for eksempel har Google utviklet en TCP-stabel for operativsystemet Fuchsia på Go-språket, CloudFlare-selskapet opprettet implementering av QUIC-protokollen i Rust, har Apple flyttet TCP-stakken på mobile enheter til brukerområdet).

I løpet av arbeidet ble det konkludert med at Rust-språket er den beste kandidaten for førerutvikling. Rusts evner eliminerer problemene forbundet med lavnivåminneadministrasjon til en pris av omtrent 2 % til 10 % ytelsestap sammenlignet med C-drivere. Go og C# anses også som egnet for å lage systemkomponenter i situasjoner der forsinkelser på under millisekunder forårsaket av søppelinnsamling er akseptabelt.

Kilde: opennet.ru

Legg til en kommentar