Porovnání výkonu síťového ovladače v 10 programovacích jazycích

Skupina výzkumníků z německých univerzit publikováno zjištění experiment, během níž bylo vyvinuto 10 variant typického ovladače pro 10gigabitové síťové karty Intel Ixgbe (X5xx) v různých programovacích jazycích. Ovladač běží 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í co nejvyššího výkonu s ohledem na vlastnosti každého jazyka. Z hlediska funkčnosti jsou všechny možnosti totožné a sestávají z přibližně 1000 řádků kódu. Úspěchy projektu šíření pod licencí BSD.

Verze ovladače Rust byla výkonem velmi blízká referenčnímu ovladači C. Se zátěží s jediným odesláním bloků 32 paketů ovladač Rust trochu zaostával, ale v testech s více než 32 pakety na blok se prakticky nelišil rychlostí od ovladače C a prokázal výkon na úrovni zpracování 28 milionů paketů za sekundu na serveru s Xeon CPU E3-1230 v2 3.3 GHz.

Porovnání výkonu síťového ovladače v 10 programovacích jazycích

Další výklenek z hlediska výkonu obsadily ovladače Go a C#, které vykazovaly poměrně těsné výsledky (ovladač Go zvítězil v testech s bloky, které obsahovaly až 16 balíčků, a začal mírně ztrácet v testech s více než 16 balíčky v jednom blok). S 256 pakety na blok byl špičkový výkon pro ovladač C# přibližně 28 Mpps a pro ovladače Go přibližně 25 Mpps.

Další, s poměrně těsnými výsledky, následovaný ovladači pro
Java, OCaml a Haskell, které již znatelně zaostávaly za dříve zvažovanými možnostmi a nedokázaly překonat laťku 12 milionů paketů za sekundu. Ještě větší backlog vykázaly ovladače založené na Swiftu a JavaScriptu, které dokázaly zpracovat streamy na úrovni 5 milionů paketů za sekundu.

Hodnocení uzavřel ovladač v jazyce Python, který dokázal zpracovat pouze 0.14 milionu paketů za sekundu. Implementace Pythonu byla použita k vyhodnocení rychlosti interpretů bez JIT a bez specifických optimalizací (kód byl spuštěn pomocí CPythonu 3.7 a nebyl kompatibilní s PyPy, ale je třeba poznamenat, že optimalizace datových struktur by mohla zlepšit výkon asi 10krát).

Kromě toho byly provedeny testy latence, které ukázaly účinnost vyrovnávací paměti a dopad sběrače odpadu. Test měřil latenci poté, co byl každý paket přesměrován ovladačem, ve srovnání se známým časem odeslání. Vedoucími byli stále ovladače C a Rust, jejichž výsledky byly téměř k nerozeznání pro tok 1 milionu paketů za sekundu (asi 20 µs). Dobře si vedl ovladač v jazyce Go, který jen mírně zaostával za lídry a také se držel na úrovni 20 µs. Ovladač C# vykazoval zpoždění asi 50 µs.
Největší zpoždění vykazovaly ovladače založené na JavaScriptu a Javě (zpoždění přes 300 µs).

Porovnání výkonu síťového ovladače v 10 programovacích jazycích

Studie byla provedena za účelem vyhodnocení možnosti vývoje ovladačů a komponent operačního systému v jazycích vyšší úrovně než C. V současné době se 39 ze 40 problémů s pamětí Linuxu týká ovladačů, takže problémy s přijetím bezpečnějšího jazyka a přesunem ovladačů z jádra do uživatelského prostoru zůstat relevantní a výrobci již v tomto směru aktivně experimentují (například Google vyvinul TCP stack pro OS Fuchsia v Go, CloudFlare vytvořené implementaci protokolu QUIC v Rustu Apple přesunul TCP stack na mobilních zařízeních do uživatelského prostoru).

V průběhu prováděných prací se dospělo k závěru, že jazyk Rust je nejlepším kandidátem pro vývoj ovladačů. Funkce poskytované Rustem vám umožňují zbavit se problémů, které vznikají kvůli práci s pamětí na nízké úrovni, za cenu snížení výkonu ve výši asi 2 % až 10 % ve srovnání s ovladači v jazyce C. Go a C# jsou také vhodné pro vytváření systémových komponent v situacích, kdy je přijatelné submilisekundové zpoždění způsobené garbage collectorem.

Zdroj: opennet.ru

Přidat komentář