Poređenje performansi mrežnih drajvera u 10 programskih jezika

Grupa istraživača sa njemačkih univerziteta objavljeno результаты eksperiment, tokom kojeg je razvijeno 10 varijanti tipičnog drajvera za 10-gigabitne Intel Ixgbe (X5xx) mrežne kartice na različitim programskim jezicima. Drajver radi u korisničkom prostoru i implementiran je u C, Rust, Go, C#, Java, OCaml, Haskell, Swift, JavaScript i Python. Prilikom pisanja koda fokus je bio na postizanju što veće performanse, uzimajući u obzir karakteristike svakog jezika. Što se tiče funkcionalnosti, sve opcije su identične i sastoje se od približno 1000 linija koda. Dostignuća projekta širenje pod BSD licencom.

Rust verzija drajvera bila je vrlo bliska po performansama referentnom C drajveru. Uz opterećenje s jednim slanjem blokova od 32 paketa, Rust drajver je malo zaostajao, ali u testovima sa više od 32 paketa po bloku, praktički se nije razlikovao u brzini od C drajvera i pokazao performanse na nivou obrade 28 miliona paketa u sekundi na serveru sa Xeon CPU E3-1230 v2 3.3 GHz.

Poređenje performansi mrežnih drajvera u 10 programskih jezika

Sljedeću nišu u pogledu performansi zauzeli su Go i C# drajveri, koji su pokazali prilično bliske rezultate (go drajver je pobijedio u testovima sa blokovima koji su uključivali do 16 paketa, a počeo je lagano gubiti u testovima sa više od 16 paketa u blok). Sa 256 paketa po bloku, vršne performanse za C# drajver bile su približno 28Mpps, a za Go drajvere, približno 25Mpps.

Sljedeće, s prilično blizu rezultata, slijede vozači za
Java, OCaml i Haskell, koji su već znatno zaostajali za opcijama koje su prethodno razmatrane i nisu mogle da pređu granicu od 12 miliona paketa u sekundi. Još veći zaostatak su pokazali drajveri zasnovani na Swift-u i JavaScript-u, koji su bili u stanju da obrađuju streamove na nivou od 5 miliona paketa u sekundi.

Drajver na jeziku Python zatvorio je rejting, koji je mogao da obradi samo 0.14 miliona paketa u sekundi. Python implementacija je korištena za procjenu brzine interpretatora bez JIT-a i bez specifičnih optimizacija (kôd je pokrenut koristeći CPython 3.7 i nije bio kompatibilan sa PyPy, ali se napominje da bi optimizacija struktura podataka mogla poboljšati performanse za oko 10 puta).

Dodatno su sprovedeni testovi latencije koji su pokazali efikasnost baferovanja i uticaj sakupljača smeća. Test je mjerio kašnjenje nakon što je svaki paket preusmjeren od strane drajvera, u poređenju sa poznatim vremenom slanja. Lideri su i dalje bili C i Rust drajveri, čiji su rezultati bili gotovo nerazlučivi za protok od milion paketa u sekundi (oko 1 µs). Vozač u Go jeziku se pokazao dobro, koji je tek neznatno zaostajao za liderima i takođe se zadržao na nivou od 20 µs. C# drajver je pokazao kašnjenje od oko 20 µs.
Drajveri zasnovani na JavaScript-u i Javi pokazali su najveća kašnjenja (kašnjenja preko 300 µs).

Poređenje performansi mrežnih drajvera u 10 programskih jezika

Studija je provedena kako bi se procijenila mogućnost razvoja drajvera i komponenti operativnog sistema na jezicima višeg nivoa od C. Trenutno, 39 od 40 Linux problema sa memorijom su povezani sa drajverima, tako da su problemi usvajanja sigurnijeg jezika i premeštanja drajvera iz kernela u korisnički prostor ostati relevantan i proizvođači već aktivno eksperimentišu u tom pravcu (na primjer, Google je razvio TCP stack za OS fuksija u Go, CloudFlare stvoren implementacija QUIC protokola u Rustu, Apple je premjestio TCP stog na mobilnim uređajima u korisnički prostor).

U toku rada zaključeno je da je Rust jezik najbolji kandidat za razvoj drajvera. Funkcije koje pruža Rust omogućavaju vam da se riješite problema koji nastaju zbog rukovanja memorijom na niskom nivou, po cijenu smanjenja performansi od oko 2% -10% u poređenju sa drajverima na C-jeziku. Go i C# su takođe pogodni za izgradnju sistemskih komponenti u situacijama kada je latencija ispod milisekunde uzrokovana sakupljačem smeća prihvatljiva.

izvor: opennet.ru

Dodajte komentar