Hálózati meghajtó teljesítményének összehasonlítása 10 programozási nyelv verzióiban

Német egyetemek kutatócsoportja kiadta eredmények kísérlet, amelynek során különböző programozási nyelveken 10 változat készült az Intel Ixgbe (X5xx) 10 gigabites hálózati kártyák szabványos illesztőprogramjából. Az illesztőprogram felhasználói térben működik, és C, Rust, Go, C#, Java, OCaml, Haskell, Swift, JavaScript és Python nyelveken van megvalósítva. A kód írásakor a fő figyelmet a lehető legnagyobb teljesítmény elérésére fordították, figyelembe véve minden nyelv sajátosságait. Funkcionalitás szempontjából mindegyik változat azonos, és körülbelül 1000 sor kódból áll. A projekt eredményei szabadon terjeszthetők BSD licenc alatt.

A Rust nyelvű illesztőprogram teljesítménye nagyon közel állt a referencia illesztőprograméhoz, amely C nyelven készült. 32 csomag egyidejű küldésével a Rust-illesztőprogram kicsit lemaradt, de több mint 32 csomaggal végzett tesztekben gyakorlatilag nem tért el a C nyelvű illesztőprogramtól, és körülbelül 28 millió csomag másodpercenkénti feldolgozási sebességet mutatott egy Xeon E3-1230 v2 3,3 GHz-es CPU-szerver esetében.

Hálózati meghajtó teljesítményének összehasonlítása 10 programozási nyelv verzióiban

A következő teljesítménybeli részesedést a Go és C# nyelveken készült illesztőprogramok érték el, amelyek elég közeli eredményeket mutattak (a Go illesztőprogram a 16 csomagig terjedő blokkok tesztjeiben nyert, majd kicsit vesztett a 16 csomagnál nagyobb blokkok tesztjeiben). 256 csomag blokkjában a C# illesztőprogram csúcs teljesítménye körülbelül 28 millió csomag másodpercenként volt, míg a Go illesztőprogram körülbelül 25 millió csomagot másodpercenként.

Ezt követően, szintén elég közeli eredményekkel,
Java, OCaml és Haskell illesztőprogramok következtek, amelyek már jelentősen lemaradtak az előbbiekhez képest, és nem tudták átlépni a 12 millió csomag másodpercenkénti szintet. Még nagyobb lemaradást mutattak a Swift és JavaScript illesztőprogramok, amelyek körülbelül 5 millió csomag másodpercenkénti sebességgel bírták a forgalmat.

A rangsort a Python nyelvű illesztőprogram zárta, amely mindössze 0,14 millió csomagot tudott feldolgozni másodpercenként. A Python megvalósítást a JIT nélküli és specifikus optimalizációk nélküli értelmezők sebességének értékelésére használták (a kódot CPython 3.7-tel futtatták, és nem volt kompatibilis a PyPy-val, de megjegyzendő, hogy az adatszerkezetek optimalizálása körülbelül 10-szeres teljesítménynövekedést érhetne el).

További teszteket végeztek a késleltetési időről, amelyek megmutatták a gyorsítótárazás hatékonyságát és a szemétgyűjtő hatását. A tesztelés során a késleltetést mérték, miután a meghajtó minden csomagot átirányított, összehasonlítva a pontosan ismert küldési idővel. A vezetők továbbra is a C és Rust driverei lettek, amelyek eredményei gyakorlatilag megkülönböztethetetlenek voltak 1 millió csomag másodpercenként (kb. 20 µs). A Go nyelvű meghajtó is jól teljesített, csupán egy kicsit lemaradva a vezetőktől, szintén 20 µs körüli értékkel. A C# meghajtó körülbelül 50 µs késleltetést mutatott.
A legnagyobb késleltetéseket a JavaScript és Java driverei mutatták (késleltetések 300 µs felett).

Hálózati meghajtó teljesítményének összehasonlítása 10 programozási nyelv verzióiban

A kutatást azzal a céllal végezték, hogy értékeljék a driverek és operációs rendszer összetevők fejlesztésének lehetőségét magasabb szintű nyelveken, mint a C. Jelenleg 39-ből 40 memóriahasználati probléma a Linuxban a driverekhez köthető, ezért a biztonságosabb nyelv alkalmazásának kérdése és a driverek felhelyezése a magból a felhasználói térbe továbbra is aktuális és a gyártók már aktívan kísérleteznek ebben az irányban (például a Google TCP-stackot fejlesztett a Fuchsia Go nyelven, a CloudFlare létrehozta rust nyelven valósította meg a QUIC protokollt, az Apple pedig áthelyezte a TCP-stackot a mobil eszközök felhasználói terébe).

A végzett munka során arra a következtetésre jutottunk, hogy a Rust nyelv a legjobb jelölt driverek fejlesztésére. A Rust által biztosított lehetőségek segítségével megszabadulhatunk a memóriakezelés alacsony szintű működéséből adódó problémáktól, cserébe körülbelül 2%-10%-os teljesítménycsökkenést szenved el a C nyelvű driverekhez képest. A Go és a C# nyelvek szintén alkalmasak rendszerszintű összetevők létrehozására, olyan helyzetekben, amikor a szemétgyűjtő alkalmazása miatti késleltetések a milliszekundum töredékére elfogadhatók.

Forrás: opennet.ru

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster