Confronto delle prestazioni del driver di rete in versioni su 10 linguaggi di programmazione

Un gruppo di ricercatori delle università tedesche ha pubblicato i risultati esperimento, durante il quale sono stati sviluppati 10 varianti di un driver standard per schede di rete Intel Ixgbe (X5xx) in diversi linguaggi di programmazione. Il driver opera nello spazio utente ed è implementato nei linguaggi C, Rust, Go, C#, Java, OCaml, Haskell, Swift, JavaScript e Python. Durante la scrittura del codice, l'attenzione principale è stata rivolta a raggiungere le massime prestazioni possibili, tenendo conto delle caratteristiche di ciascun linguaggio. Funzionalmente, tutte le varianti sono identiche e consistono in circa 1000 righe di codice. Le attività del progetto sono distribuiti sotto licenza BSD.

La variante del driver in Rust si è dimostrata molto vicina in termini di prestazioni al driver di riferimento in linguaggio C. Con un carico di invio simultaneo di pacchetti in blocchi da 32, il driver in Rust era leggermente in ritardo, ma nei test con più di 32 pacchetti per blocco, la velocità era praticamente indistinguibile dal driver in C e mostrava prestazioni di elaborazione di 28 milioni di pacchetti al secondo su un server con CPU Xeon E3-1230 v2 3.3 GHz.

Confronto delle prestazioni del driver di rete in versioni su 10 linguaggi di programmazione

Il successivo in termini di prestazioni sono stati i driver nei linguaggi Go e C#, che hanno mostrato risultati abbastanza simili (il driver in Go vinceva nei test con blocchi fino a 16 pacchetti, ma ha iniziato a perdere nei test con più di 16 pacchetti per blocco). Con 256 pacchetti per blocco, il picco delle prestazioni del driver in C# ha raggiunto circa 28 milioni di pacchetti al secondo, mentre il driver in Go ha raggiunto circa 25 milioni di pacchetti al secondo.

Successivamente, con risultati abbastanza vicini, si sono posizionati i driver in
Java, OCaml e Haskell, i quali già mostrano un notevole ritardo rispetto alle varianti precedenti e non sono riusciti a superare la soglia di 12 milioni di pacchetti al secondo. Un ulteriore ritardo significativo è stato mostrato dai driver in Swift e JavaScript, che sono riusciti a elaborare flussi a un livello di 5 milioni di pacchetti al secondo.

Chiude la classifica il driver in linguaggio Python, che è riuscito a elaborare solo 0,14 milioni di pacchetti al secondo. L'implementazione in Python è stata utilizzata per valutare la velocità di esecuzione degli interpreti senza JIT e senza ottimizzazioni specifiche (il codice è stato eseguito utilizzando CPython 3.7 e non era compatibile con PyPy, ma si osserva che l'ottimizzazione delle strutture di archiviazione dei dati potrebbe aumentare le prestazioni di circa 10 volte).

Sono stati inoltre condotti test sui tempi di latenza, che hanno mostrato l'efficacia della memorizzazione nella cache e l'impatto del garbage collector. Durante i test è stata misurata la latenza dopo il reindirizzamento di ciascun pacchetto da parte del driver rispetto al tempo di invio noto con precisione. I leader rimangono i driver in C e Rust, i cui risultati erano praticamente indistinguibili per un flusso di 1 milione di pacchetti al secondo (circa 20 µs). Il driver in Go ha mostrato buone prestazioni, rimanendo appena dietro ai leader e mantenendosi anche a 20 µs. Il driver in C# ha mostrato latenze di circa 50 µs.
Le latenze più elevate sono state registrate dai driver in JavaScript e Java (latenze superiori a 300 µs).

Confronto delle prestazioni del driver di rete in versioni su 10 linguaggi di programmazione

La ricerca è stata condotta per valutare la possibilità di sviluppare driver e componenti del sistema operativo in linguaggi di livello superiore rispetto a C. Attualmente, 39 dei 40 problemi di gestione della memoria in Linux riguardano i driver, quindi le questioni relative all'uso di un linguaggio più sicuro e al trasferimento dei driver dallo kernel allo spazio utente rimangono attuali. I produttori stanno già sperimentando attivamente in questa direzione (ad esempio, Google ha sviluppato uno stack TCP per il sistema operativo Fuchsia in Go, l'azienda CloudFlare ha creato l'implementazione del protocollo QUIC in Rust, l'azienda Apple ha trasferito lo stack TCP sui dispositivi mobili nello spazio utente).

Dall'analisi effettuata si conclude che il linguaggio Rust è il miglior candidato per lo sviluppo di driver. Le funzionalità offerte da Rust permettono di eliminare i problemi derivanti dal lavoro a basso livello con la memoria, a fronte di una diminuzione delle prestazioni di circa il 2%-10% rispetto ai driver in C. Anche i linguaggi Go e C# sono stati considerati idonei per la creazione di componenti di sistema, in situazioni in cui sono accettabili latenze nell'ordine di frazioni di millisecondo, causate dall'uso del garbage collector.

Fonte: opennet.ru

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster