Параўнанне прадукцыйнасці сеткавага драйвера ў варыянтах на 10 мовах праграмавання

Група даследчыкаў з нямецкіх універсітэтаў апублікавала вынікі эксперыменту, Падчас якога на розных мовах праграмавання было распрацавана 10 варыянтаў тыпавога драйвера для 10-гігабітных сеткавых карт Intel Ixgbe (X5xx). Драйвер працуе ў прасторы карыстача і рэалізаваны на мовах C, Rust, Go, C#, Java, OCaml, Haskell, Swift, JavaScript і Python. Пры напісанні кода асноўная ўвага надавалася дасягненню максімальна магчымай прадукцыйнасці з улікам асаблівасцей кожнай мовы. Па функцыянальнасці ўсе варыянты ідэнтычныя і складаюцца прыкладна з 1000 радкоў кода. Напрацоўкі праекта распаўсюджваюцца пад ліцэнзіяй BSD.

Варыянт драйвера на мове Rust аказаўся вельмі блізкі па прадукцыйнасці да эталоннага драйвера на мове Сі. Пры нагрузцы з аднаразовай адпраўкай блокаў па 32 пакета Rust-драйвер крыху адставаў, але ў тэстах з больш за 32 пакетамі ў блоку па хуткасці практычна не адрозніваўся ад драйвера на Сі і дэманстраваў прадукцыйнасць на ўзроўні апрацоўкі 28 млн пакетаў у секунду на серверы з CPU Xeon E3-1230 v2 3.3/XNUMX GHz.

Параўнанне прадукцыйнасці сеткавага драйвера ў варыянтах на 10 мовах праграмавання

Наступную нішу па прадукцыйнасці занялі драйверы на мовах Go і З#, якія паказалі досыць блізкія вынікі (драйвер на Go выйграваў у тэстах з блокамі, улучальнымі да 16 пакетаў, і стаў трохі прайграваць у тэстах з больш за 16 пакетамі ў блоку). Пры 256 пакетах у блоку пікавая прадукцыйнасць пры драйвера на C# склала прыкладна 28 млн пакетаў у секунду, а драйвера на Go прыкладна 25 млн пакетаў у секунду.

Далей з досыць блізкімі вынікамі вынікалі драйверы на
Java, OCaml і Haskell, якія ўжо прыкметна адставалі ад раней разгледжаных варыянтаў і не змаглі пераадолець планку ў 12 млн. пакетаў у секунду. Яшчэ большае адставанне паказалі драйверы на Swift і JavaScript, якія змаглі апрацаваць плыні на ўзроўні 5 млн пакетаў у секунду.

Замкнуў рэйтынг драйвер на мове Python, які змог апрацаваць за ўсё 0.14 млн пакетаў у секунду. Рэалізацыя на Python была скарыстана для адзнакі хуткасці працы інтэрпрэтатараў без JIT і без спецыфічных аптымізацый (код выконваўся з выкарыстаннем CPython 3.7 і не быў сумяшчальны з PyPy, але адзначаецца, што аптымізацыя структур захоўвання дадзеных магла б падвысіць прадукцыйнасць прыкладна ў 10 раз).

Дадаткова былі праведзены тэсты на час затрымкі, якія паказвалі эфектыўнасць буферызацыі і ўплыў зборшчыка смецця. Пры тэставанні вымяралася затрымка пасля перанакіравання кожнага пакета драйверам у параўнанні з сапраўды вядомым часам адпраўкі. Лідэрамі па-ранейшаму сталі драйверы на Сі і Rust, вынікі якіх былі практычна неадрозныя для патоку ў 1 млн пакетаў у секунду (прыкладна 20 µs). Добра праявіў сябе драйвер на мове Go, які толькі крыху адстаў ад лідэраў і таксама трымаўся на ўзроўні 20 µs. Драйвер на C# паказаў затрымкі прыкладна ў 50 µs.
Самыя вялікія затрымкі паказалі драйверы на JavaScript і Java (затрымкі больш за 300 µs).

Параўнанне прадукцыйнасці сеткавага драйвера ў варыянтах на 10 мовах праграмавання

Даследаванне праведзена з мэтай адзнакі магчымасці распрацоўкі драйвераў і кампанентаў аперацыйнай сістэмы на мовах больш высокага ўзроўня, чым Сі. У наш час 39 з 40 праблем пры працы з памяццю ў Linux даводзяцца на драйверы, таму пытанні ўжывання больш бяспечнай мовы і вынасу драйвераў з ядра ў прастору карыстача застаюцца актуальнымі і вытворцы ўжо актыўна эксперыментуюць у гэтым кірунку (напрыклад, Google распрацаваў TCP-стэк для АС Фуксія на мове Go, кампанія CloudFlare стварыла рэалізацыю пратаколу QUIC на мове Rust, кампанія Apple перанесла TCP-стэк на мабільных прыладах у прастору карыстальніка).

Падчас праведзенай працы зроблена выснова, што мова Rust з'яўляецца найлепшым кандыдатам для распрацоўкі драйвераў. Якія прадстаўляюцца ў Rust магчымасці дазваляюць пазбавіцца ад праблем, якія ўзнікаюць з-за нізкаўзроўневай працы з памяццю, коштам зніжэння прадукцыйнасці прыкладна на 2%-10% у параўнанні з драйверамі на мове Сі. Мовы Go і C# таксама прызнаныя прыдатнымі для стварэння сістэмных кампанентаў, у сітуацыях калі прымальныя затрымкі на ўзроўні дзеляў мілісекунд, выкліканыя ўжываннем зборшчыка смецця.

Крыніца: opennet.ru

Дадаць каментар