Fergeliking fan prestaasjes fan netwurkbestjoerder yn ferzjes yn 10 programmeartalen

In groep ûndersikers fan Dútske universiteiten publisearre de resultaten eksperimint, wêrby't 10 ferzjes fan in standert stjoerprogramma foar 10-gigabit Intel Ixgbe (X5xx) netwurkkaarten waarden ûntwikkele yn ferskate programmeartalen. De bestjoerder rint yn brûkersromte en wurdt ymplementearre yn C, Rust, Go, C#, Java, OCaml, Haskell, Swift, JavaScript en Python. By it skriuwen fan koade lei it haadfokus op it berikken fan de bêste mooglike prestaasjes, rekken hâldend mei de skaaimerken fan elke taal. Alle opsjes binne identyk yn funksjonaliteit en besteane út likernôch 1000 rigels koade. Project ûntwikkelings fersprieding ûnder de BSD-lisinsje.

De Rust-ferzje fan 'e sjauffeur die bliken yn prestaasjes heul ticht by de referinsjebestjoerder yn' e C-taal. Under in lading mei simultane ferstjoeren fan blokken fan 32 pakketten, de Rust-bestjoerder wie wat efter, mar yn testen mei mear as 32 pakketten per blok, de snelheid wie praktysk net oars as de C-bestjoerder en demonstrearre prestaasjes op it nivo fan ferwurking 28 miljoen pakketten per sekonde op in tsjinner mei in Xeon CPU E3-1230 v2 3.3 GHz.

Fergeliking fan prestaasjes fan netwurkbestjoerder yn ferzjes yn 10 programmeartalen

De folgjende niche yn termen fan prestaasjes waard beset troch sjauffeurs yn 'e Go- en C#-talen, dy't frij tichte resultaten sjen litte (de Go-bestjoerder wûn yn tests mei blokken fan maksimaal 16 pakketten, en begon wat te ferliezen yn tests mei mear as 16 pakketten yn in blok). Mei 256 pakketten per blok wie de peakprestaasjes fan 'e C #-bestjoerder sawat 28 miljoen pakketten per sekonde, en de Go-bestjoerder wie sawat 25 miljoen pakketten per sekonde.

Folgjende, mei frij ticht resultaten, wiene de sjauffeurs foar
Java, OCaml en Haskell, dy't al merkber efter de earder beskôge opsjes wiene en de 12 miljoen pakketten per sekonde bar net koene oerwinne. Swift- en JavaScript-bestjoerders lieten in noch gruttere efterstân sjen, en koene streamen ferwurkje op it nivo fan 5 miljoen pakketten per sekonde.

De topranglist waard foltôge troch de Python-bestjoerder, dy't mar 0.14 miljoen pakketten per sekonde koe ferwurkje. De Python-ymplemintaasje waard brûkt om de snelheid fan 'e tolken te evaluearjen sûnder JIT en sûnder spesifike optimisaasjes (de koade waard útfierd mei CPython 3.7 en wie net kompatibel mei PyPy, mar it wurdt opmurken dat optimisaasje fan gegevensopslachstruktueren de prestaasjes mei sawat 10 kear ferbetterje koe ).

Derneist waarden latencytests útfierd om de effektiviteit fan buffering en de ynfloed fan 'e garbage collector oan te toanen. De testen mjitten de latency neidat elk pakket troch de bestjoerder trochstjoerd waard yn ferliking mei de krekte tiid dat it waard ferstjoerd. De lieders wiene noch altyd de C- en Rust-bestjoerders, wêrfan de resultaten praktysk net te ûnderskieden wiene foar in stream fan 1 miljoen pakketten per sekonde (sawat 20 µs). De Go-bestjoerder prestearre goed, wie mar in bytsje efter de lieders en bleau ek op it nivo fan 20 µs. De C#-bestjoerder toande fertragingen fan sawat 50 µs.
De langste fertragingen waarden werjûn troch JavaScript- en Java-bestjoerders (latencies fan mear dan 300 µs).

Fergeliking fan prestaasjes fan netwurkbestjoerder yn ferzjes yn 10 programmeartalen

De stúdzje waard útfierd om de mooglikheid te beoardieljen fan it ûntwikkeljen fan bestjoerders en bestjoeringssysteemkomponinten yn talen op heger nivo dan C. Op it stuit binne 39 fan 'e 40 ûnthâldproblemen yn Linux relatearre oan bestjoerders, dus de problemen fan it brûken fan in feiliger taal en it ferpleatsen fan bestjoerders út 'e kernel en yn brûkersromte relevant bliuwe en fabrikanten eksperimintearje al aktyf yn dizze rjochting (Google hat bygelyks in TCP-stapel ûntwikkele foar it OS fuchsia yn Go taal, CloudFlare bedriuw makke ymplemintaasje fan it QUIC-protokol yn Rust, Apple hat de TCP-stapel op mobile apparaten nei brûkersromte ferpleatst).

Yn de rin fan it wurk waard konkludearre dat de Rusttaal de bêste kandidaat is foar sjauffeursûntwikkeling. De mooglikheden fan Rust eliminearje de problemen ferbûn mei ûnthâldbehear op leech nivo foar de kosten fan sawat 2% oant 10% prestaasjesferlies yn ferliking mei C-bestjoerders. Go en C # wurde ek beskôge geskikt foar it meitsjen fan systeem komponinten yn situaasjes dêr't sub-millisekonden latency feroarsake troch garbage collection is akseptabel.

Boarne: opennet.ru

Add a comment