Sammenligning af netværksdriverydelse på 10 programmeringssprog

En gruppe forskere fra tyske universiteter опубликовала resultaterne eksperiment, hvor 10 varianter af en typisk driver til 10-gigabit Intel Ixgbe (X5xx) netværkskort blev udviklet i forskellige programmeringssprog. Driveren kører i brugerrum og er implementeret i C, Rust, Go, C#, Java, OCaml, Haskell, Swift, JavaScript og Python. Ved skrivning af koden var der fokus på at opnå den højest mulige ydeevne under hensyntagen til hvert sprogs egenskaber. Med hensyn til funktionalitet er alle muligheder identiske og består af cirka 1000 linjer kode. Projektresultater spredning under BSD-licensen.

Rust-versionen af ​​driveren var meget tæt på reference C-driveren i ydeevne. Med en belastning med en enkelt afsendelse af blokke på 32 pakker haltede Rust-driveren lidt, men i test med mere end 32 pakker per blok adskilte den sig praktisk talt ikke i hastighed fra C-driveren og demonstrerede ydeevne på behandlingsniveau 28 millioner pakker i sekundet på en server med en Xeon CPU E3-1230 v2 3.3 GHz.

Sammenligning af netværksdriverydelse på 10 programmeringssprog

Den næste niche med hensyn til ydeevne blev besat af Go- og C#-drivere, som viste ret tætte resultater (Go-driveren vandt i test med blokke, der omfattede op til 16 pakker, og begyndte at tabe lidt i test med mere end 16 pakker i en blok). Med 256 pakker pr. blok var topydelsen for C#-driveren cirka 28Mpps, og for Go-driverne cirka 25Mpps.

Dernæst med ret tætte resultater, efterfulgt af chauffører for
Java, OCaml og Haskell, som allerede var mærkbart bag de tidligere overvejede muligheder og ikke kunne overvinde baren på 12 millioner pakker i sekundet. Drivere baseret på Swift og JavaScript viste et endnu større efterslæb, som var i stand til at behandle streams på niveauet 5 millioner pakker i sekundet.

Driveren i Python-sproget lukkede ratingen, som kun var i stand til at behandle 0.14 millioner pakker i sekundet. Python-implementeringen blev brugt til at evaluere hastigheden af ​​tolke uden JIT og uden specifikke optimeringer (koden blev kørt ved hjælp af CPython 3.7 og var ikke kompatibel med PyPy, men det bemærkes, at optimering af datastrukturer kunne forbedre ydeevnen med omkring 10 gange).

Derudover blev der udført latenstest, som viste effektiviteten af ​​buffering og virkningen af ​​skraldeopsamleren. Testen målte latenstiden efter hver pakke blev omdirigeret af driveren, sammenlignet med en kendt sendetid. Lederne var stadig C- og Rust-driverne, hvis resultater næsten ikke kunne skelnes for et flow på 1 million pakker i sekundet (ca. 20 µs). Chaufføren i Go-sproget klarede sig godt, som kun var lidt bagefter lederne og også holdt sig på niveauet 20 µs. C#-driveren viste forsinkelser på omkring 50 µs.
Drivere baseret på JavaScript og Java viste de største forsinkelser (forsinkelser på over 300 µs).

Sammenligning af netværksdriverydelse på 10 programmeringssprog

Undersøgelsen blev udført for at evaluere muligheden for at udvikle drivere og operativsystemkomponenter på sprog på et højere niveau end C. I øjeblikket er 39 ud af 40 Linux-hukommelsesproblemer driver-relaterede, så problemerne med at indføre et mere sikkert sprog og flytte drivere ud af kernen og ind i brugerrummet forblive relevante og producenter eksperimenterer allerede aktivt i denne retning (for eksempel har Google udviklet en TCP-stak til OS Fuchsia i Go, CloudFlare oprettet implementering af QUIC-protokollen i Rust, flyttede Apple TCP-stakken på mobile enheder til brugerområdet).

I løbet af det udførte arbejde blev det konkluderet, at Rust-sproget er den bedste kandidat til chaufførudvikling. Funktionerne leveret af Rust giver dig mulighed for at slippe af med de problemer, der opstår på grund af hukommelseshåndtering på lavt niveau, til bekostning af en ydeevnestraf på omkring 2%-10% sammenlignet med C-sprog drivere. Go og C# viser sig også at være velegnede til at bygge systemkomponenter i situationer, hvor latens på under millisekunder forårsaget af skraldeopsamleren er acceptabel.

Kilde: opennet.ru

Tilføj en kommentar