Usporedba performansi mrežnog upravljačkog programa u verzijama na 10 programskih jezika

Skupina istraživača s njemačkih sveučilišta опубликовала rezultate eksperiment, tijekom kojeg je razvijeno 10 verzija standardnog upravljačkog programa za 10-gigabitne Intel Ixgbe (X5xx) mrežne kartice u različitim programskim jezicima. Upravljački program radi u korisničkom prostoru i implementiran je u C, Rust, Go, C#, Java, OCaml, Haskell, Swift, JavaScript i Python. Prilikom pisanja koda, glavni fokus je bio na postizanju najbolje moguće izvedbe, uzimajući u obzir karakteristike svakog jezika. Sve opcije su identične u funkcionalnosti i sastoje se od približno 1000 redaka koda. Razvoj projekta širenje pod BSD licencom.

Pokazalo se da je Rust verzija upravljačkog programa po performansama vrlo bliska referentnom upravljačkom programu u jeziku C. Pod opterećenjem s istodobnim slanjem blokova od 32 paketa, Rust driver je malo zaostajao, ali u testovima s više od 32 paketa po bloku, brzina se praktički nije razlikovala od C drivera i pokazao je performanse na razini obrade 28 milijuna paketa u sekundi na poslužitelju s Xeon CPU E3-1230 v2 3.3 GHz.

Usporedba performansi mrežnog upravljačkog programa u verzijama na 10 programskih jezika

Sljedeću nišu u pogledu performansi zauzeli su upravljački programi u jezicima Go i C#, koji su pokazali prilično bliske rezultate (Go upravljački program je pobijedio u testovima s blokovima do 16 paketa, a počeo lagano gubiti u testovima s više od 16 paketa u bloku). S 256 paketa po bloku, vršna izvedba C# drajvera bila je približno 28 milijuna paketa u sekundi, a Go drajvera bila je približno 25 milijuna paketa u sekundi.

Sljedeći, s prilično tijesnim rezultatima, bili su vozači za
Java, OCaml i Haskell, koji su već osjetno zaostajali za prethodno razmatranim opcijama i nisu mogli prevladati traku od 12 milijuna paketa u sekundi. Swift i JavaScript upravljački programi pokazali su još veći zaostatak, jer su mogli obraditi streamove na razini od 5 milijuna paketa u sekundi.

Vrh ljestvice dopunio je Python driver koji je uspio obraditi samo 0.14 milijuna paketa u sekundi. Implementacija Pythona korištena je za procjenu brzine tumača bez JIT-a i bez specifičnih optimizacija (kôd je izvršen korištenjem CPython 3.7 i nije bio kompatibilan s PyPy, no napominje se da bi optimizacija struktura za pohranu podataka mogla poboljšati performanse za oko 10 puta ).

Dodatno, provedeni su testovi latencije kako bi se pokazala učinkovitost međuspremnika i utjecaj sakupljača smeća. Testiranje je mjerilo kašnjenje nakon što je svaki paket proslijeđen od strane vozača u usporedbi s točnim vremenom kada je poslan. Vodeći su i dalje C i Rust drajveri, čiji su rezultati bili praktički nerazlučivi za protok od 1 milijun paketa u sekundi (otprilike 20 µs). Go vozač se dobro pokazao, tek neznatno je zaostao za vodećima i također ostao na razini od 20 µs. C# upravljački program pokazao je kašnjenja od približno 50 µs.
Najduža kašnjenja pokazala su JavaScript i Java drajveri (latencije veće od 300 µs).

Usporedba performansi mrežnog upravljačkog programa u verzijama na 10 programskih jezika

Studija je provedena kako bi se procijenila mogućnost razvoja upravljačkih programa i komponenti operativnog sustava na jezicima više razine od C. Trenutačno je 39 od 40 problema s memorijom u Linuxu povezano s upravljačkim programima, dakle problemi korištenja sigurnijeg jezika i premještanja upravljačkih programa iz kernela u korisnički prostor ostati relevantan a proizvođači već aktivno eksperimentiraju u tom smjeru (na primjer, Google je razvio TCP stack za OS Fuksija na Go jeziku, tvrtka CloudFlare stvorena implementacije QUIC protokola u Rustu, Apple je premjestio TCP stog na mobilnim uređajima u korisnički prostor).

Tijekom rada zaključeno je da je Rust jezik najbolji kandidat za razvoj drajvera. Rustove mogućnosti eliminiraju probleme povezane s upravljanjem memorijom niske razine po cijenu približno 2% do 10% gubitka performansi u usporedbi s C drajverima. Go i C# također se smatraju prikladnima za stvaranje komponenti sustava u situacijama u kojima je prihvatljivo kašnjenje ispod milisekunde uzrokovano skupljanjem smeća.

Izvor: opennet.ru

Dodajte komentar