Tinklo tvarkyklių našumo palyginimas versijomis 10 programavimo kalbų

Grupė mokslininkų iš Vokietijos universitetų опубликовала išvados эksperimenta, kurio metu buvo sukurta 10 standartinės tvarkyklės versijų 10 gigabitų Intel Ixgbe (X5xx) tinklo plokštėms skirtingomis programavimo kalbomis. Vairuotojas veikia vartotojo erdvėje ir yra įdiegtas C, Rust, Go, C#, Java, OCaml, Haskell, Swift, JavaScript ir Python. Rašant kodą didžiausias dėmesys buvo skiriamas kuo geresniam našumui, atsižvelgiant į kiekvienos kalbos ypatybes. Visų parinkčių funkcionalumas yra identiškas ir susideda iš maždaug 1000 kodo eilučių. Projektų plėtrai skleisti pagal BSD licenciją.

Tvarkyklės „Rust“ versija savo našumu pasirodė labai artima etaloninei tvarkyklei C kalba. Esant apkrovai, kai vienu metu buvo siunčiami 32 paketų blokai, „Rust“ tvarkyklė šiek tiek atsiliko, tačiau bandymuose su daugiau nei 32 paketais viename bloke greitis praktiškai nesiskyrė nuo C tvarkyklės ir parodė našumą apdorojimo lygiu 28 mln. paketų per sekundę serveryje su Xeon CPU E3-1230 v2 3.3 GHz.

Tinklo tvarkyklių našumo palyginimas versijomis 10 programavimo kalbų

Kitą nišą pagal našumą užėmė „Go“ ir „C#“ kalbų tvarkyklės, kurios rodė gana artimus rezultatus (Go vairuotojas laimėjo testus su blokais iki 16 paketų ir pradėjo šiek tiek pralaimėti bandymuose su daugiau nei 16 paketų bloke). Naudojant 256 paketus viename bloke, didžiausias C# tvarkyklės našumas buvo maždaug 28 milijonai paketų per sekundę, o Go tvarkyklės – maždaug 25 milijonai paketų per sekundę.

Toliau, su gana artimais rezultatais, buvo vairuotojai
Java, OCaml ir Haskell, kurios jau pastebimai atsiliko nuo anksčiau svarstytų variantų ir negalėjo įveikti 12 milijonų paketų per sekundę juostos. „Swift“ ir „JavaScript“ tvarkyklės parodė dar didesnį atsilikimą, nes galėjo apdoroti srautus 5 milijonų paketų per sekundę greičiu.

Aukščiausią reitingą užbaigė Python tvarkyklė, kuri sugebėjo apdoroti tik 0.14 mln. paketų per sekundę. Python diegimas buvo naudojamas interpretatorių greičiui įvertinti be JIT ir be specifinių optimizacijų (kodas buvo vykdomas naudojant CPython 3.7 ir nebuvo suderinamas su PyPy, tačiau pažymima, kad duomenų saugojimo struktūrų optimizavimas galėtų pagerinti našumą apie 10 kartų ).

Be to, buvo atlikti delsos testai, siekiant parodyti buferio efektyvumą ir šiukšlių surinkėjo poveikį. Atliekant bandymą buvo matuojamas delsos laikas po kiekvieno paketo persiuntimo vairuotojo, palyginti su tiksliu jo išsiuntimo laiku. Lyderiais vis dar buvo C ir Rust vairuotojai, kurių rezultatai praktiškai nesiskyrė 1 milijono paketų per sekundę (apie 20 µs) srautui. „Go“ vairuotojas pasirodė gerai, tik šiek tiek atsilikdamas nuo lyderių ir taip pat liko 20 µs lygyje. C# tvarkyklė rodė maždaug 50 µs vėlavimą.
Ilgiausius vėlavimus parodė „JavaScript“ ir „Java“ tvarkyklės (delsos daugiau nei 300 µs).

Tinklo tvarkyklių našumo palyginimas versijomis 10 programavimo kalbų

Tyrimas buvo atliktas siekiant įvertinti galimybę kurti tvarkykles ir operacinės sistemos komponentus aukštesnio lygio kalbomis nei C. Šiuo metu 39 iš 40 Linux atminties problemų yra susijusios su tvarkyklėmis, todėl kyla problemų dėl saugesnės kalbos naudojimo ir tvarkyklių perkėlimo iš branduolio į vartotojo erdvę. išlieka aktualūs ir gamintojai jau aktyviai eksperimentuoja šia kryptimi (pavyzdžiui, Google sukūrė TCP steką OS Fuksija „Go“ kalba, įmonė „CloudFlare“. sukurtas įdiegus QUIC protokolą Rust, Apple perkėlė mobiliųjų įrenginių TCP krūvą į vartotojo erdvę).

Darbo metu buvo prieita prie išvados, kad Rust kalba yra geriausia kandidatė vairuotojo tobulėjimui. „Rust“ galimybės pašalina problemas, susijusias su žemo lygio atminties valdymu, našumo praradimu maždaug nuo 2% iki 10%, palyginti su C tvarkyklėmis. „Go“ ir „C#“ taip pat laikomi tinkamais sistemos komponentams kurti tais atvejais, kai priimtinas šiukšlių surinkimo sukeltas submilisekundės delsa.

Šaltinis: opennet.ru

Добавить комментарий