A hálózati illesztőprogramok teljesítményének összehasonlítása 10 programozási nyelv verzióiban

Német egyetemek kutatóinak csoportja közzétett eredmények kísérlet, melynek során a 10 gigabites Intel Ixgbe (X10xx) hálózati kártyák szabványos illesztőprogramjának 5 változatát fejlesztették ki különböző programozási nyelveken. Az illesztőprogram felhasználói térben fut, és C, Rust, Go, C#, Java, OCaml, Haskell, Swift, JavaScript és Python nyelveken valósul meg. A kódírás során a fő hangsúly a lehető legjobb teljesítmény elérésén volt, figyelembe véve az egyes nyelvek sajátosságait. Az összes opció funkcionalitása azonos, és körülbelül 1000 kódsorból áll. Projektfejlesztések terjedés a BSD licenc alatt.

Az illesztőprogram Rust verziója teljesítményében nagyon közel áll a C nyelvű referencia-illesztőprogramhoz. A 32 csomag blokkjainak egyidejű küldésével járó terhelés alatt a Rust illesztőprogram kissé lemaradt, de a blokkonként több mint 32 csomagot tartalmazó tesztekben a sebesség gyakorlatilag nem különbözött a C illesztőprogramtól, és 28 milliós feldolgozási szinten mutatott teljesítményt. csomagok másodpercenként Xeon CPU E3-1230 v2 3.3 GHz-es szerveren.

A hálózati illesztőprogramok teljesítményének összehasonlítása 10 programozási nyelv verzióiban

A teljesítmény tekintetében a következő rést a Go és C# nyelvű illesztőprogramok foglalták el, amelyek meglehetősen közeli eredményeket mutattak (a Go illesztőprogram nyert a legfeljebb 16 csomagos blokkokkal végzett teszteken, és enyhén veszíteni kezdett a több mint 16 csomagot tartalmazó teszteken blokkban). A blokkonkénti 256 csomaggal a C# illesztőprogram csúcsteljesítménye hozzávetőlegesen 28 millió csomag/másodperc volt, a Go illesztőprogramé pedig hozzávetőleg 25 millió csomag/másodperc volt.

Következő, meglehetősen szoros eredménnyel, voltak a vezetők
Java, OCaml és Haskell, amelyek már érezhetően lemaradtak a korábban mérlegelt opcióktól, és nem tudták leküzdeni a másodpercenkénti 12 milliós csomagot. A Swift és a JavaScript illesztőprogramok még nagyobb késést mutattak, mivel másodpercenként 5 millió csomagot tudtak feldolgozni.

A legfelső helyezést a Python driver tette fel, amely mindössze 0.14 millió csomagot tudott feldolgozni másodpercenként. A Python implementációt használták az interpretátorok sebességének kiértékelésére JIT nélkül és speciális optimalizálás nélkül (a kód CPython 3.7-el futott, és nem volt kompatibilis a PyPy-vel, de meg kell jegyezni, hogy az adattároló struktúrák optimalizálása körülbelül 10-szeresére növelheti a teljesítményt ).

Ezenkívül látencia teszteket is végeztek a pufferelés hatékonyságának és a szemétgyűjtő hatásának kimutatására. A tesztelés során az egyes csomagok illesztőprogram általi továbbítása utáni késleltetést mérték, összehasonlítva a küldés pontos idejével. A vezetők továbbra is a C és a Rust meghajtók voltak, amelyek eredménye gyakorlatilag megkülönböztethetetlen volt a másodpercenkénti 1 millió csomag (körülbelül 20 µs) áramlásánál. A Go versenyzője jól teljesített, csak kismértékben maradt le a vezetőktől, és a 20 µs-os szinten is maradt. A C# illesztőprogram körülbelül 50 µs-os késést mutatott.
A leghosszabb késéseket a JavaScript és a Java illesztőprogramok mutatták (a késések több mint 300 µs).

A hálózati illesztőprogramok teljesítményének összehasonlítása 10 programozási nyelv verzióiban

A tanulmányt azért végezték, hogy felmérjék az illesztőprogramok és operációs rendszer-összetevők fejlesztésének lehetőségét a C-nél magasabb szintű nyelveken. Jelenleg a Linuxban a 39 memóriaprobléma közül 40 az illesztőprogramokhoz kapcsolódik, így a biztonságosabb nyelv használatának és az illesztőprogramok kernelből a felhasználói térbe való áthelyezésének problémái. relevánsak maradnak és a gyártók már aktívan kísérleteznek ebben az irányban (például a Google kifejlesztett egy TCP-vermet az operációs rendszerhez Fukszia Go nyelven, CloudFlare cég létre A QUIC protokoll Rustban való megvalósítása során az Apple a mobileszközökön lévő TCP-vermet a felhasználói térbe helyezte).

A munka során arra a következtetésre jutottak, hogy a Rust nyelv a legjobb jelölt a járművezetők fejlesztésére. A Rust képességei kiküszöbölik az alacsony szintű memóriakezeléssel kapcsolatos problémákat a C-illesztőprogramokhoz képest körülbelül 2–10%-os teljesítményveszteség árán. A Go és a C# alkalmasnak tekinthető rendszerelemek létrehozására is olyan helyzetekben, ahol a szemétgyűjtés okozta ezredmásodperc alatti késleltetés elfogadható.

Forrás: opennet.ru

Hozzászólás