Un grup de cercetători de la universitățile germane rezultatele , în cadrul căruia au fost dezvoltate în diferite limbaje de programare 10 variante de driver standard pentru plăcile de rețea Intel Ixgbe (X5xx) de 10 gigabiți. Driverul funcționează în spațiul utilizatorului și este implementat în limbajele C, Rust, Go, C#, Java, OCaml, Haskell, Swift, JavaScript și Python. La scrierea codului, atenția principală a fost îndreptată spre atingerea performanței maxime posibile, având în vedere specificitățile fiecărui limbaj. Din punct de vedere funcțional, toate variantele sunt identice și constau în aproximativ 1000 de linii de cod. Rezultatele proiectului sub licența BSD.
Varianta driverului în limbajul Rust s-a dovedit a fi foarte aproape de performanța driverului de referință în limbajul C. În condiții de încărcare cu trimiterea simultană a blocurilor de 32 de pachete, driverul Rust a fost puțin în urma, dar în testele cu mai mult de 32 de pachete în bloc, viteza a fost practic similară cu cea a driverului în C și a demonstrat o performanță de procesare de 28 de milioane de pachete pe secundă pe un server cu CPU Xeon E3-1230 v2 la 3,3 GHz.
Următoarea nișă de performanță a fost ocupată de driverii în limbajele Go și C#, care au arătat rezultate destul de apropiate (driverul în Go câștiga în testele cu blocuri ce includeau până la 16 pachete, dar a început să piardă în testele cu mai mult de 16 pachete în bloc). La 256 de pachete în bloc, performanța maximă a driverului în C# a fost de aproximativ 28 de milioane de pachete pe secundă, iar driverul în Go de aproximativ 25 de milioane de pachete pe secundă.
Apoi, cu rezultate destul de apropiate au urmat driverii în
Java, OCaml și Haskell, care au fost deja vizibil în urma variantelor discutate anterior și nu au reușit să depășească limita de 12 milioane de pachete pe secundă. O întârziere și mai mare a fost arătată de driverii în Swift și JavaScript, care au reușit să proceseze fluxuri la nivelul de 5 milioane de pachete pe secundă.
Clasamentul a fost încheiat de driverul în limbajul Python, care a reușit să proceseze doar 0,14 milioane de pachete pe secundă. Implementarea în Python a fost utilizată pentru a evalua viteza de execuție a interpretorilor fără JIT și fără optimizări specifice (codul a fost executat utilizând CPython 3.7 și nu era compatibil cu PyPy, dar se menționează că optimizarea structurii de stocare a datelor ar putea îmbunătăți performanța de aproximativ 10 ori).
Testele de latență au fost, de asemenea, efectuate, arătând eficiența buffer-ului și influența colectorului de gunoi. În timpul testării, s-a măsurat latența după ce fiecare pachet a fost redirecționat de driver comparativ cu timpul exact de trimitere. Liderii au fost, în continuare, driverele scrise în C și Rust, ale căror rezultate au fost practic indistingușabile pentru un flux de 1 milion de pachete pe secundă (aproximativ 20 µs). Driverul scris în Go s-a descurcat bine, fiind puțin în urma liderilor și menținându-se, de asemenea, la nivelul de 20 µs. Driverul pe C# a arătat latențe de aproximativ 50 µs.
Cele mai mari latențe au fost înregistrate de driverele pe JavaScript și Java (latențe mai mari de 300 µs).
Cercetarea a fost efectuată cu scopul de a evalua fezabilitatea dezvoltării driverelor și a componentelor sistemului de operare în limbaje de nivel mai înalt decât C. În prezent, 39 din 40 de probleme de gestionare a memoriei în Linux sunt legate de drivere, așa că întrebările privind utilizarea unui limbaj mai sigur și transferul driverelor din kernel în spațiul utilizatorului iar producătorii experimentează deja activ în această direcție (de exemplu, Google a dezvoltat un stivă TCP pentru sistemul de operare în limbajul Go, compania CloudFlare implementarea protocolului QUIC în limbajul Rust, iar compania Apple a mutat stiva TCP pe dispozitivele mobile în spațiul utilizatorului).
În urma lucrărilor desfășurate, s-a ajuns la concluzia că limbajul Rust este cel mai bun candidat pentru dezvoltarea driverelor. Funcționalitățile oferite de Rust permit eliminarea problemelor care apar din cauza lucrului la nivel scăzut cu memoria, cu un cost de scădere a performanței de aproximativ 2%-10% în comparație cu driverele scrise în C. Limbajele Go și C# sunt, de asemenea, considerate adecvate pentru crearea componentelor sistemului, în situațiile în care latentele de fracțiuni de milisecundă, cauzate de utilizarea unui colector de gunoi, sunt acceptabile.
Sursa: opennet.ro
