10 бағдарламалау тілінде желілік драйвер өнімділігін салыстыру

Германия университеттерінің зерттеушілер тобы жарияланған Нәтижелері эксперимент, оның барысында әртүрлі бағдарламалау тілдерінде 10 гигабиттік Intel Ixgbe (X10xx) желілік карталарына арналған типтік драйвердің 5 нұсқасы әзірленді. Драйвер пайдаланушы кеңістігінде жұмыс істейді және C, Rust, Go, C#, Java, OCaml, Haskell, Swift, JavaScript және Python тілдерінде жүзеге асырылады. Кодты жазу кезінде әр тілдің ерекшеліктерін ескере отырып, мүмкін болатын ең жоғары өнімділікке қол жеткізуге назар аударылды. Функционалдық жағынан барлық опциялар бірдей және шамамен 1000 код жолынан тұрады. Жобаның жетістіктері кеңейтіңіз BSD лицензиясы бойынша.

Драйвердің Rust нұсқасы анықтамалық C драйверіне өте жақын болды. 32 пакеттік блоктарды бір рет жіберумен жүктеме кезінде Rust драйвері сәл артта қалды, бірақ блокқа 32 пакеттен көп сынақтарда ол C драйверінен жылдамдығымен іс жүзінде ерекшеленбеді және өңдеу деңгейінде өнімділікті көрсетті. Xeon E28-3 v1230 2 ГГц процессоры бар серверде секундына 3.3 миллион пакет.

10 бағдарламалау тілінде желілік драйвер өнімділігін салыстыру

Өнімділік бойынша келесі орынды Go және C# драйверлері иеленді, олар өте жақын нәтиже көрсетті (Go драйвері 16 пакетті қамтитын блоктары бар сынақтарда жеңді, ал 16 пакеттен астам сынақтарда аздап жеңіле бастады. блок). Бір блокта 256 пакет болған кезде C# драйвері үшін ең жоғары өнімділік шамамен 28Mpps, ал Go драйверлері үшін шамамен 25Mpps болды.

Әрі қарай, өте жақын нәтижелер, содан кейін драйверлер
Java, OCaml және Haskell, олар бұрын қарастырылған опциялардан айтарлықтай артта қалды және секундына 12 миллион пакетті жеңе алмады. Swift және JavaScript негізіндегі драйверлер секундына 5 миллион пакет деңгейінде ағындарды өңдей алатын одан да үлкен артта қалушылықты көрсетті.

Python тіліндегі драйвер секундына 0.14 миллион пакетті ғана өңдей алатын рейтингті жауып тастады. Python енгізуі JIT-сіз және арнайы оңтайландыруларсыз интерпретаторлардың жылдамдығын бағалау үшін пайдаланылды (код CPython 3.7 арқылы іске қосылды және PyPy-мен үйлесімді болмады, бірақ деректер құрылымдарын оңтайландыру өнімділікті шамамен 10 есе жақсартуға болатыны атап өтілген).

Бұған қоса, буферлеудің тиімділігі мен қоқыс жинағыштың әсерін көрсететін кідіріс сынақтары жүргізілді. Сынақ белгілі жіберу уақытымен салыстырғанда әрбір пакетті драйвер қайта бағыттағаннан кейін күту уақытын өлшеді. Көшбасшылар әлі де C және Rust драйверлері болды, олардың нәтижелері секундына 1 миллион пакет (шамамен 20 мкс) ағыны үшін дерлік айырмашылығы жоқ. Go тіліндегі драйвер жақсы орындады, ол көшбасшылардан сәл ғана артта қалды және сонымен қатар 20 мкс деңгейінде болды. C# драйвері шамамен 50 мкс кідірістерді көрсетті.
JavaScript және Java негізіндегі драйверлер ең үлкен кідірістерді көрсетті (300 мкс-тен астам кідіріс).

10 бағдарламалау тілінде желілік драйвер өнімділігін салыстыру

Зерттеу драйверлер мен операциялық жүйе құрамдастарын C тілінен жоғары деңгейдегі тілдерде әзірлеу мүмкіндігін бағалау мақсатында жүргізілді. Қазіргі уақытта 39 Linux жады мәселесінің 40-ы драйверге байланысты, сондықтан қауіпсіз тілді қабылдау және драйверлерді ядродан және пайдаланушы кеңістігіне жылжыту мәселелері өзекті болып қала береді және өндірушілер осы бағытта белсенді түрде тәжірибе жасап жатыр (мысалы, Google операциялық жүйеге арналған TCP стекін әзірледі. Фуксия Go, CloudFlare қолданбасында құрылды Rust-та QUIC протоколын іске асыру, Apple мобильді құрылғылардағы TCP стегін пайдаланушы кеңістігіне жылжытты).

Жүргізілген жұмыс барысында Rust тілі драйверді дамытуға ең жақсы үміткер деген қорытындыға келді. Rust ұсынатын мүмкіндіктер C тіліндегі драйверлермен салыстырғанда шамамен 2%-10% өнімділік айыппұлы есебінен төмен деңгейлі жадты өңдеуге байланысты туындайтын мәселелерден құтылуға мүмкіндік береді. Go және C# сонымен қатар қоқыс жинағыштан туындаған миллисекундтық кідіріс қолайлы жағдайларда жүйе құрамдастарын құру үшін қолайлы болып табылады.

Ақпарат көзі: opennet.ru

пікір қалдыру