Comparazione di prestazioni di u driver di rete in 10 lingue di prugrammazione

Un gruppu di circadori da università tedesche publicatu Risultati esperimentu, durante quale 10 varianti di un driver tipicu per e carte di rete 10-gigabit Intel Ixgbe (X5xx) sò stati sviluppati in diverse lingue di prugrammazione. U driver corre in u spaziu di l'utilizatori è hè implementatu in C, Rust, Go, C#, Java, OCaml, Haskell, Swift, JavaScript è Python. Quandu scrivite u codice, l'enfasi era di ottene u rendimentu più altu pussibule, tenendu in contu e caratteristiche di ogni lingua. In quantu à e funziunalità, tutte l'opzioni sò identiche è sò custituiti da circa 1000 linee di codice. Rializazioni di u prugettu sparghje sottu a licenza BSD.

A versione Rust di u driver era assai vicinu in u rendiment à u driver C di riferimentu. Cù una carica cù un solu mandatu di blocchi di pacchetti 32, u driver Rust hà ritardatu un pocu, ma in i testi cù più di 32 pacchetti per bloccu, praticamenti ùn hà micca diffirenti in a velocità di u cunduttore C è hà dimustratu u rendiment à u livellu di trasfurmazioni. 28 milioni di pacchetti per seconda in un servitore cù una CPU Xeon E3-1230 v2 3.3 GHz.

Comparazione di prestazioni di u driver di rete in 10 lingue di prugrammazione

U prossimu nichu in termini di prestazioni hè stata occupata da i piloti Go è C#, chì anu dimustratu risultati abbastanza vicini (u pilotu Go hà vintu in teste cù blocchi chì includenu finu à 16 pacchetti, è hà cuminciatu à perde un pocu in teste cù più di 16 pacchetti in un bloccu). Cù 256 pacchetti per bloccu, a prestazione massima per u driver C# era di circa 28Mpps, è per i driver Go, circa 25Mpps.

Dopu, cù risultati abbastanza vicinu, seguitu da i cunduttori per
Java, OCaml è Haskell, chì eranu digià notevolmente daretu à l'opzioni prima cunsiderate è ùn pudianu superà a barra di 12 milioni di pacchetti per seconda. I cunduttori basati in Swift è JavaScript anu dimustratu un backlog ancu più grande, chì anu pussutu processà flussi à u livellu di 5 milioni di pacchetti per seconda.

U cunduttore in a lingua Python hà chjusu a qualificazione, chì era capaci di processà solu 0.14 milioni di pacchetti per seconda. L'implementazione di Python hè stata aduprata per evaluà a rapidità di l'interpreti senza JIT è senza ottimisazioni specifiche (u codice hè stata eseguita cù CPython 3.7 è ùn era micca cumpatibile cù PyPy, ma hè nutatu chì l'ottimisazione di e strutture di dati puderia migliurà u rendiment per circa 10 volte).

Inoltre, i testi di latenza sò stati realizati, chì anu dimustratu l'efficacità di u buffering è l'impattu di u cullettore di basura. A prova hà misuratu a latenza dopu chì ogni pacchettu hè statu reindirizzatu da u cunduttore, cumparatu cù un tempu di mandatu cunnisciutu. I capi eranu sempre i driver C è Rust, chì i risultati eranu quasi indistinguibili per un flussu di 1 milione di pacchetti per seconda (circa 20 µs). U driver in a lingua Go hà fattu bè, chì era solu un pocu daretu à i capi è ancu mantene à u livellu di 20 µs. U driver C# mostrava ritardi di circa 50 µs.
I cunduttori basati in JavaScript è Java anu dimustratu i più grandi ritardi (ritardi più di 300 µs).

Comparazione di prestazioni di u driver di rete in 10 lingue di prugrammazione

U studiu hè statu realizatu per valutà a pussibilità di sviluppà driver è cumpunenti di u sistema operatore in lingue di un livellu più altu ch'è C. Attualmente, 39 di 40 prublemi di memoria di Linux sò ligati à i driver, cusì i prublemi di aduttà una lingua più sicura è di trasfurmà i drivers fora di u kernel è in u spaziu di l'utilizatori. resta pertinenti è i pruduttori sò digià sperimentatu attivamente in questa direzzione (per esempiu, Google hà sviluppatu una pila TCP per OS Fuchsia in Go, CloudFlare criatu implementazione di u protokollu QUIC in Rust, Apple hà spustatu a pila TCP in i dispositi mobili à u spaziu di l'utilizatori).

In u cursu di u travagliu realizatu, hè statu cunclusu chì a lingua Rust hè u megliu candidatu per u sviluppu di u driver. I funziunalità furnuti da Rust permettenu di sbarazzà di i prublemi chì si sviluppanu per a gestione di a memoria di pocu livellu, à u costu di una penalità di rendiment di circa 2% -10% paragunatu à i cunduttori in lingua C. Go è C # sò ancu trovati adatti per creà cumpunenti di u sistema in situazioni induve i ritardi sottu-millisecondi causati da u cullettivu di basura sò accettabili.

Source: opennet.ru

Add a comment