Skupina vědců z německých univerzit výsledky , během kterého byly vyvinuty 10 variant standardního ovladače pro 10-gigabitové síťové karty Intel Ixgbe (X5xx) v různých programovacích jazycích. Ovladač pracuje v uživatelském prostoru a je implementován v jazycích C, Rust, Go, C#, Java, OCaml, Haskell, Swift, JavaScript a Python. Při psaní kódu byl kladen důraz na dosažení maximální možné výkonnosti s ohledem na specifika každého jazyka. Všechny varianty jsou funkčně identické a mají přibližně 1000 řádků kódu. Výstupy projektu na základě licence BSD.
Varianta ovladače v jazyce Rust se ukázala jako velmi blízká výkonnosti referenčnímu ovladači v jazyce C. Při zátěži s jednorázovým odesláním bloků po 32 paketech Rust-ovladač mírně zaostával, ale v testech s více než 32 pakety v bloku se rychlostí prakticky nelišil od ovladače v C a vykazoval výkon na úrovni zpracování 28 milionů paketů za sekundu na serveru s CPU Xeon E3-1230 v2 3,3 GHz.
Další místo podle výkonnosti obsadily ovladače v jazycích Go a C#, které vykázaly poměrně blízké výsledky (ovladač v Go vyhrával v testech s bloky zahrnujícími až 16 paketů, a mírně zaostával v testech s více než 16 pakety v bloku). Při 256 paketech v bloku dosáhl vrcholový výkon ovladače v C# přibližně 28 milionů paketů za sekundu, zatímco ovladač v Go dosáhl přibližně 25 milionů paketů za sekundu.
Poté následovaly ovladače s poměrně blízkými výsledky v jazycích
Java, OCaml a Haskell, které již viditelně zaostávaly za dříve uvedenými variantami a nedokázaly překonat hranici 12 milionů paketů za sekundu. Ještě větší zaostávání vykázaly ovladače v jazycích Swift a JavaScript, které dokázaly zpracovat toky na úrovni 5 milionů paketů za sekundu.
Na posledním místě se umístil ovladač v jazyce Python, který dokázal zpracovat pouze 0,14 milionu paketů za sekundu. Implementace v Pythonu byla použita k odhadu rychlosti práce interpretů bez JIT a bez specifických optimalizací (kód byl prováděn pomocí CPython 3.7 a nebyl kompatibilní s PyPy, ale je poznamenáno, že optimalizace struktur ukládání dat by mohla zvýšit výkon přibližně 10krát).
Byly provedeny další testy latence, které ukázaly účinnost vyrovnávací paměti a dopad garbage collectoru. Při testování byla měřena latence po přesměrování každého paketu ovladačem v porovnání s přesně stanoveným časem odeslání. Vedoucími se i nadále stali ovladače v jazycích C a Rust, jejichž výsledky byly prakticky nerozeznatelné při průtoku 1 milionu paketů za sekundu (přibližně 20 µs). Ovladač v jazyce Go se rovněž osvědčil, pouze mírně zaostal za lídry a také se udržoval na úrovni 20 µs. Ovladač v C# vykázal latenci přibližně 50 µs.
Nejvyšší latence vykázaly ovladače v JavaScriptu a Javě (latence přes 300 µs).
Studie byla provedena za účelem zhodnocení možnosti vývoje ovladačů a komponent operačního systému v jazycích vyšší úrovně než C. V současnosti 39 z 40 problémů s pamětí v Linuxu souvisí s ovladači, a proto otázky použití bezpečnějšího jazyka a přesunutí ovladačů z jádra do prostoru uživatelů zůstávají aktuální. v jazyce Go, společnost CloudFlare realizaci protokolu QUIC v jazyce Rust, společnost Apple přesunula TCP stack na mobilních zařízeních do prostoru uživatele). Na základě provedené práce bylo dosaženo závěru, že jazyk Rust je nejlepším kandidátem pro vývoj ovladačů. Možnosti poskytované v Rustu umožňují zbavit se problémů vyplývajících z nízkoúrovňové práce s pamětí, za cenu snížení výkonu přibližně o 2–10 % ve srovnání s ovladači v jazyce C. Jazyky Go a C# byly také uznány jako vhodné pro vytváření systémových komponent v situacích, kdy jsou přijatelné latence v řádu milisekund, způsobené použitím garbage collectoru.
Skupina výzkumníků z německých univerzit zveřejnila výsledky
Zdroj: opennet.ru
