Skupina vedcov z nemeckých univerzít výsledky , v rámci ktorého bolo na rôznych programovacích jazykoch vyvinutých 10 variantov typického ovládača pre 10-gigabitové sieťové karty Intel Ixgbe (X5xx). Ovládač funguje v užívateľskom priestore a je implementovaný v jazykoch C, Rust, Go, C#, Java, OCaml, Haskell, Swift, JavaScript a Python. Pri písaní kódu sa hlavná pozornosť venovala dosiahnutiu maximálnej možnej výkonnosti s ohľadom na charakteristiky každého jazyka. Z hľadiska funkčnosti sú všetky varianty identické a pozostávajú približne z 1000 riadkov kódu. Výsledky projektu pod licenciou BSD.
Varianta ovládača v jazyku Rust bola veľmi blízko výkonnosti referenčného ovládača v jazyku C. Pri záťaži s súčasným odoslaním blokov po 32 paketoch Rust-ovládač mal mierny odstup, ale v testoch s viac než 32 paketmi v bloku sa rýchlostne takmer nelišil od ovládača v jazyku C a dosahoval výkon na úrovni spracovania 28 miliónov paketov za sekundu na serveri s CPU Xeon E3-1230 v2 3.3 GHz.
Nasledujúcu priečku podľa výkonnosti obsadili ovládače v jazykoch Go a C#, ktoré dosiahli dosť blízke výsledky (ovládač na Go vyhrával v testoch s blokmi obsahujúcimi do 16 paketov a začal mierne prehrávať v testoch s viac než 16 paketmi v bloku). Pri 256 paketoch v bloku dosiahla vrcholná výkonnosť ovládača v jazyku C# približne 28 miliónov paketov za sekundu, zatiaľ čo ovládač na Go približne 25 miliónov paketov za sekundu.
Potom s dosť blízkymi výsledkami nasledovali ovládače na
Java, OCaml a Haskell, ktoré už viditeľne zaostávali za skôr preskúmanými variantmi a nedokázali prekročiť hranicu 12 miliónov paketov za sekundu. Ešte väčšie zaostávanie preukázali ovládače na Swift a JavaScript, ktoré dokázali spracovať toky na úrovni 5 miliónov paketov za sekundu.
Na konci rebríčka skončil ovládač v jazyku Python, ktorý dokázal spracovať iba 0.14 milióna paketov za sekundu. Implementácia v Pythone bola použitá na vyhodnotenie rýchlosti práce interpretátorov bez JIT a bez špecifických optimalizácií (kód bol vykonávaný s použitím CPython 3.7 a nebol kompatibilný s PyPy, ale uvádza sa, že optimalizácia štruktúr uchovávania dát by mohla zvýšiť výkonnosť približne 10-násobne).
Dodatočne boli vykonané testy latencie, ktoré ukázali účinnosť vyrovnávacej pamäte a vplyv odpadového zberača. Pri testovaní sa merala latencia po presmerovaní každého paketu ovládačom v porovnaní s presne známy čas odoslania. Vedúce pozície zaujal aj naďalej ovládač na C a Rust, ktorých výsledky boli takmer nerozoznateľné pre prenos 1 milióna paketov za sekundu (približne 20 µs). Ovládač na jazyku Go sa tiež výborne osvedčil, keď len o niečo zaostal za lídrami a jeho latencia sa tiež pohybovala na úrovni 20 µs. Ovládač na C# vykázal latenciu približne 50 µs.
Najväčšiu latenciu vykázali ovládače na JavaScripte a Jave (latencie nad 300 µs).
Výskum bol vykonaný s cieľom zhodnotiť možnosti vývoja ovládačov a komponentov operačného systému v jazykov, ktoré sú na vyššej úrovni ako C. V súčasnosti sa 39 z 40 problémov pri práci s pamäťou v Linuxe týka ovládačov, preto otázky použitia bezpečnejšieho jazyka a presunu ovládačov z jadra do používateľského priestoru A výrobcovia už aktívne experimentujú v tomto smere (napríklad Google vyvinul TCP zásobník pre OS na jazyku Go, spoločnosť CloudFlare implementáciu protokolu QUIC na jazyku Rust, spoločnosť Apple presunula TCP zásobník na mobilných zariadeniach do používateľského priestoru).
V priebehu vykonanej práce sa dospel k záveru, že jazyk Rust je najlepším kandidátom na vývoj ovládačov. Možnosti poskytované jazykom Rust umožňujú zbaviť sa problémov vyplývajúcich z nízkoúrovňovej práce s pamäťou, pričom cena je zníženie výkonu približne o 2%-10% v porovnaní s ovládačmi na jazyku C. Jazyky Go a C# sú tiež považované za vhodné na vytváranie systémových komponentov v situáciách, keď sú prijateľné latencie na úrovni zlomkov milisekúnd spôsobené použitím odpadového zberača.
Zdroj: opennet.ru
