Vergelijking van de prestaties van netwerkstuurprogramma's in versies in 10 programmeertalen

Een groep onderzoekers van Duitse universiteiten опубликовала bevindingen experiment, waarbij 10 versies van een standaard driver voor 10 gigabit Intel Ixgbe (X5xx) netwerkkaarten werden ontwikkeld in verschillende programmeertalen. De driver draait in gebruikersruimte en is geïmplementeerd in C, Rust, Go, C#, Java, OCaml, Haskell, Swift, JavaScript en Python. Bij het schrijven van code lag de nadruk vooral op het behalen van de best mogelijke prestaties, rekening houdend met de kenmerken van elke taal. Alle opties zijn qua functionaliteit identiek en bestaan ​​uit circa 1000 regels code. Projectontwikkelingen worden verspreid onder BSD-licentie.

De Rust-versie van de driver bleek qua prestaties zeer dicht bij de referentiedriver in de C-taal te liggen. Onder belasting met gelijktijdig verzenden van blokken van 32 pakketten liep de Rust-driver iets achter, maar in tests met meer dan 32 pakketten per blok was de snelheid praktisch niet anders dan die van de C-driver en demonstreerde hij prestaties op het niveau van verwerking van 28 miljoen pakketten per seconde op een server met een Xeon CPU E3-1230 v2 3.3 GHz.

Vergelijking van de prestaties van netwerkstuurprogramma's in versies in 10 programmeertalen

De volgende niche op het gebied van prestaties werd ingenomen door stuurprogramma's in de talen Go en C#, die redelijk goede resultaten lieten zien (het Go-stuurprogramma won in tests met blokken van maximaal 16 pakketten en begon lichtjes te verliezen in tests met meer dan 16 pakketten in een blok). Met 256 pakketten per blok bedroegen de piekprestaties van het C#-stuurprogramma ongeveer 28 miljoen pakketten per seconde, en het Go-stuurprogramma ongeveer 25 miljoen pakketten per seconde.

Vervolgens, met redelijk goede resultaten, kwamen de coureurs aan de beurt
Java, OCaml en Haskell, die al merkbaar achterbleven bij de eerder overwogen opties en de balk van 12 miljoen pakketten per seconde niet konden overwinnen. Swift- en JavaScript-stuurprogramma's vertoonden een nog grotere vertraging, omdat ze streams konden verwerken met een snelheid van 5 miljoen pakketten per seconde.

De toppositie werd gecompleteerd door de Python-driver, die slechts 0.14 miljoen pakketten per seconde kon verwerken. De Python-implementatie werd gebruikt om de snelheid van de tolken te evalueren zonder JIT en zonder specifieke optimalisaties (de code werd uitgevoerd met behulp van CPython 3.7 en was niet compatibel met PyPy, maar er wordt opgemerkt dat optimalisatie van gegevensopslagstructuren de prestaties met ongeveer 10 keer zou kunnen verbeteren ).

Daarnaast zijn latentietests uitgevoerd om de effectiviteit van buffering en de impact van de garbage collector aan te tonen. Bij de tests werd de latentie gemeten nadat elk pakket door de driver was doorgestuurd, vergeleken met het exacte tijdstip waarop het werd verzonden. De leiders waren nog steeds de C- en Rust-drivers, waarvan de resultaten vrijwel niet van elkaar te onderscheiden waren voor een stroom van 1 miljoen pakketten per seconde (ongeveer 20 µs). De Go-coureur presteerde goed, stond slechts iets achter op de leiders en bleef ook op het niveau van 20 µs. De C#-driver vertoonde vertragingen van ongeveer 50 µs.
De langste vertragingen werden waargenomen door JavaScript- en Java-stuurprogramma's (latenties van meer dan 300 µs).

Vergelijking van de prestaties van netwerkstuurprogramma's in versies in 10 programmeertalen

Het onderzoek werd uitgevoerd om de mogelijkheid te beoordelen om stuurprogramma's en besturingssysteemcomponenten te ontwikkelen in talen van een hoger niveau dan C. Momenteel zijn 39 van de 40 geheugenproblemen in Linux gerelateerd aan stuurprogramma's, dus de problemen van het gebruik van een veiligere taal en het verplaatsen van stuurprogramma's uit de kernel naar de gebruikersruimte relevant blijven en fabrikanten experimenteren al actief in deze richting (Google heeft bijvoorbeeld een TCP-stack voor het besturingssysteem ontwikkeld Fuchsia in Go-taal, CloudFlare-bedrijf gemaakt implementatie van het QUIC-protocol in Rust heeft Apple de TCP-stack op mobiele apparaten naar de gebruikersruimte verplaatst).

In de loop van het werk werd geconcludeerd dat de Rust-taal de beste kandidaat is voor de ontwikkeling van stuurprogramma's. De mogelijkheden van Rust elimineren de problemen die gepaard gaan met geheugenbeheer op laag niveau, ten koste van ongeveer 2% tot 10% prestatieverlies vergeleken met C-stuurprogramma's. Go en C# worden ook geschikt geacht voor het maken van systeemcomponenten in situaties waarin latentie van minder dan een milliseconde, veroorzaakt door garbage collection, acceptabel is.

Bron: opennet.ru

Voeg een reactie