Jämförelse av prestanda för nätverksdrivrutiner i versioner på 10 programmeringsspråk

En grupp forskare från tyska universitet опубликовала resultat experimentera, under vilken 10 versioner av en standarddrivrutin för 10-gigabit Intel Ixgbe (X5xx) nätverkskort utvecklades i olika programmeringsspråk. Drivrutinen körs i användarutrymme och är implementerad i C, Rust, Go, C#, Java, OCaml, Haskell, Swift, JavaScript och Python. När man skrev kod låg huvudfokus på att uppnå bästa möjliga prestanda, med hänsyn till varje språks egenskaper. Alla alternativ är identiska i funktionalitet och består av cirka 1000 rader kod. Projektutveckling sprida under BSD-licensen.

Rustversionen av drivrutinen visade sig vara mycket nära referensdrivrutinen i C-språket i prestanda. Under en belastning med samtidig sändning av block med 32 paket var Rust-föraren något efter, men i tester med mer än 32 paket per block skilde sig hastigheten praktiskt taget inte från C-föraren och visade prestanda på nivån för bearbetning 28 miljoner paket per sekund på en server med en Xeon CPU E3-1230 v2 3.3 GHz.

Jämförelse av prestanda för nätverksdrivrutiner i versioner på 10 programmeringsspråk

Nästa nisch när det gäller prestanda ockuperades av förare i Go- och C#-språken, som visade ganska nära resultat (Go-föraren vann i tester med block på upp till 16 paket och började förlora något i tester med mer än 16 paket i ett block). Med 256 paket per block var toppprestandan för C#-drivrutinen cirka 28 miljoner paket per sekund, och Go-drivrutinen var cirka 25 miljoner paket per sekund.

Därefter, med ganska nära resultat, var förarna för
Java, OCaml och Haskell, som redan var märkbart efter de tidigare övervägda alternativen och inte kunde övervinna 12 miljoner paket per sekund bar. Swift- och JavaScript-drivrutiner visade en ännu större fördröjning och kunde bearbeta strömmar på nivån 5 miljoner paket per sekund.

Topprankingen fullbordades av Python-föraren, som kunde bearbeta endast 0.14 miljoner paket per sekund. Python-implementationen användes för att utvärdera hastigheten på tolkarna utan JIT och utan specifika optimeringar (koden exekverades med CPython 3.7 och var inte kompatibel med PyPy, men det noteras att optimering av datalagringsstrukturer kan förbättra prestandan med cirka 10 gånger ).

Dessutom utfördes latenstest för att visa effektiviteten av buffring och effekten av sophämtaren. Testningen mätte latensen efter att varje paket vidarebefordrades av föraren jämfört med den exakta tidpunkten det skickades. Ledarna var fortfarande C- och Rust-drivrutinerna, vars resultat var praktiskt taget omöjliga att särskilja för ett flöde på 1 miljon paket per sekund (ungefär 20 µs). Go-föraren presterade bra, var bara något efter ledarna och låg också kvar på nivån 20 µs. C#-drivrutinen visade förseningar på cirka 50 µs.
De längsta förseningarna visades av JavaScript- och Java-drivrutiner (fördröjningar på mer än 300 µs).

Jämförelse av prestanda för nätverksdrivrutiner i versioner på 10 programmeringsspråk

Studien genomfördes för att bedöma möjligheten att utveckla drivrutiner och operativsystemkomponenter på språk på högre nivå än C. För närvarande är 39 av 40 minnesproblem i Linux relaterade till drivrutiner, så problemen med att använda ett säkrare språk och flytta ut drivrutiner från kärnan och till användarutrymmet förbli relevant och tillverkare experimenterar redan aktivt i denna riktning (till exempel har Google utvecklat en TCP-stack för operativsystemet Fuchsia på Go-språk, CloudFlare-företaget skapas implementering av QUIC-protokollet i Rust, har Apple flyttat TCP-stacken på mobila enheter till användarutrymmet).

Under arbetets gång kom man fram till att språket Rust är den bästa kandidaten för förarutveckling. Rusts kapacitet eliminerar problemen som är förknippade med minneshantering på låg nivå till en kostnad av cirka 2 % till 10 % prestandaförlust jämfört med C-drivrutiner. Go och C# anses också lämpliga för att skapa systemkomponenter i situationer där latens på under millisekunder orsakad av sophämtning är acceptabel.

Källa: opennet.ru

Lägg en kommentar