Сравнение производителността на мрежовия драйвер в вариантите на 10 програмни езика

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

Вариантът на драйвера на езика Rust се оказа много близък по производителност до референтния драйвер на езика C. При натоварване с едновременно изпращане на блокове от 32 пакета, Rust-драйверът малко изоставаше, но в тестовете с повече от 32 пакета в блока почти не се различаваше от драйвера на C и демонстрираше производителност на ниво обработка от 28 млн пакета в секунда на сървър с CPU Xeon E3-1230 v2 3.3 GHz.

Сравнение производителността на мрежовия драйвер в вариантите на 10 програмни езика

Следващата ниша по производителност заемаха драйверите на езиците Go и C#, които показаха доста близки резултати (драйверът на 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 стек за операционната система Fuchsia на езика Go, компанията CloudFlare създаде имплементация на протокола QUIC на языка Rust, а компанията Apple премести TCP стека на мобилни устройства в пространството на потребителя).

В хода на проведената работа е направен извод, че езикът Rust е най-добрият кандидат за разработка на шофири. Предоставените възможности в Rust позволяват да се избегнат проблеми, произтичащи от нискоуровневата работа с паметта, цената на което е намаляване на производителността с около 2%-10% в сравнение с шофирите на езика Си. Езиците Go и C# също са признати за подходящи за създаване на системни компоненти, в ситуации при които са приемливи забавяния на ниво части от милисекундите, причинени от използването на сборщик на боклук.

Източник: opennet.ru

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster