Porovnanie výkonu sieťových ovládačov vo verziách v 10 programovacích jazykoch

Skupina výskumníkov z nemeckých univerzít опубликовала zistenie эksperimenta, počas ktorého bolo vyvinutých 10 verzií štandardného ovládača pre 10-gigabitové sieťové karty Intel Ixgbe (X5xx) v rôznych programovacích jazykoch. Ovládač beží 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ý dôraz kládol na dosiahnutie čo najlepšieho výkonu s prihliadnutím na vlastnosti každého jazyka. Všetky možnosti sú funkčne identické a pozostávajú z približne 1000 riadkov kódu. Vývoj projektu šírenie pod licenciou BSD.

Ukázalo sa, že verzia ovládača Rust je výkonovo veľmi blízka referenčnému ovládaču v jazyku C. Pri záťaži so súčasným odosielaním blokov 32 paketov síce Rust driver mierne zaostával, no v testoch s viac ako 32 paketmi na blok sa rýchlosť prakticky nelíšila od C drivera a predviedol výkon na úrovni spracovania 28 mil. paketov za sekundu na serveri s procesorom Xeon E3-1230 v2 3.3 GHz.

Porovnanie výkonu sieťových ovládačov vo verziách v 10 programovacích jazykoch

Ďalšie miesto z hľadiska výkonu obsadili ovládače v jazykoch Go a C#, ktoré vykazovali pomerne tesné výsledky (ovládač Go zvíťazil v testoch s blokmi až 16 paketov a začal mierne strácať v testoch s viac ako 16 paketmi. v bloku). Pri 256 paketoch na blok bol špičkový výkon ovládača C# približne 28 miliónov paketov za sekundu a ovládača Go približne 25 miliónov paketov za sekundu.

Ďalej, s pomerne tesnými výsledkami, boli vodiči pre
Java, OCaml a Haskell, ktoré už výrazne zaostávali za predtým zvažovanými možnosťami a nedokázali prekonať 12 miliónov paketov za sekundu. Ovládače Swift a JavaScript vykazovali ešte väčšie oneskorenie, pretože dokázali spracovať streamy na úrovni 5 miliónov paketov za sekundu.

Najvyššie hodnotenie doplnil ovládač Python, ktorý dokázal spracovať iba 0.14 milióna paketov za sekundu. Implementácia Pythonu sa použila na vyhodnotenie rýchlosti tlmočníkov bez JIT a bez špecifických optimalizácií (kód bol vykonaný pomocou CPythonu 3.7 a nebol kompatibilný s PyPy, ale treba poznamenať, že optimalizácia štruktúr ukladania údajov by mohla zvýšiť výkon približne 10-krát ).

Okrem toho sa vykonali testy latencie, aby sa preukázala účinnosť vyrovnávacej pamäte a vplyv zberača odpadu. Testovanie meralo latenciu po preposlaní každého paketu ovládačom v porovnaní s presným časom jeho odoslania. Na čele boli stále ovládače C a Rust, ktorých výsledky boli prakticky nerozoznateľné pri toku 1 milióna paketov za sekundu (približne 20 µs). Ovládač Go fungoval dobre, len mierne zaostával za lídrami a tiež zostal na úrovni 20 µs. Ovládač C# vykazoval oneskorenie približne 50 µs.
Najdlhšie oneskorenia vykazovali ovládače JavaScript a Java (latencie viac ako 300 µs).

Porovnanie výkonu sieťových ovládačov vo verziách v 10 programovacích jazykoch

Štúdia bola vykonaná s cieľom posúdiť možnosť vývoja ovládačov a komponentov operačného systému v jazykoch vyššej úrovne ako C. V súčasnosti 39 zo 40 problémov s pamäťou v Linuxe súvisí s ovládačmi, takže problémy s používaním bezpečnejšieho jazyka a presúvaním ovládačov z jadra do užívateľského priestoru zostávajú relevantné a výrobcovia už v tomto smere aktívne experimentujú (napríklad Google vyvinul TCP stack pre OS Fuchsie v jazyku Go, spoločnosť CloudFlare vytvorené implementáciou protokolu QUIC v Ruste Apple presunul TCP stack na mobilných zariadeniach do užívateľského priestoru).

V priebehu práce sa dospelo k záveru, že jazyk Rust je najlepším kandidátom na vývoj ovládačov. Schopnosti Rustu eliminujú problémy spojené so správou pamäte na nízkej úrovni za cenu približne 2 až 10 % straty výkonu v porovnaní s ovládačmi C. Go a C# sa tiež považujú za vhodné na vytváranie systémových komponentov v situáciách, kde je prijateľná submilisekundová latencia spôsobená zberom odpadu.

Zdroj: opennet.ru

Pridať komentár