10 ta dasturlash tilidagi versiyalarda tarmoq drayverlarining ishlashini taqqoslash

Germaniya universitetlaridan bir guruh tadqiqotchilar e'lon qilindi Natijalar tajriba, uning davomida turli dasturlash tillarida 10 gigabitli Intel Ixgbe (X10xx) tarmoq kartalari uchun standart drayverning 5 ta versiyasi ishlab chiqilgan. Drayv foydalanuvchi maydonida ishlaydi va C, Rust, Go, C#, Java, OCaml, Haskell, Swift, JavaScript va Python tillarida amalga oshiriladi. Kod yozishda asosiy e'tibor har bir tilning xususiyatlarini inobatga olgan holda eng yaxshi ishlashga erishishga qaratildi. Barcha variantlar funksional jihatdan bir xil va taxminan 1000 qator koddan iborat. Loyiha ishlanmalari tarqaldi BSD litsenziyasi ostida.

Drayvning Rust versiyasi ishlash jihatidan C tilidagi mos yozuvlar drayveriga juda yaqin bo'lib chiqdi. 32 paketli bloklarni bir vaqtning o'zida jo'natish bilan yuk ostida Rust drayveri biroz orqada qoldi, ammo har bir blokda 32 paketdan ortiq bo'lgan sinovlarda tezlik C drayveridan deyarli farq qilmadi va 28 millionni qayta ishlash darajasida ishlashni namoyish etdi. Xeon CPU E3-1230 v2 3.3 gigagertsli serverda soniyasiga paketlar.

10 ta dasturlash tilidagi versiyalarda tarmoq drayverlarining ishlashini taqqoslash

Ishlash bo'yicha keyingi o'rinni Go va C# tillaridagi drayverlar egalladi, bu juda yaqin natijalarni ko'rsatdi (Go drayveri 16 paketgacha bo'lgan bloklar bilan testlarda g'alaba qozondi va 16 dan ortiq paketli testlarda biroz yutqazishni boshladi. blokda). Har bir blokda 256 paket bilan C# drayverining eng yuqori ishlashi soniyasiga taxminan 28 million paketni, Go drayveri esa soniyasiga taxminan 25 million paketni tashkil etdi.

Keyingi, juda yaqin natijalar bilan haydovchilar edi
Java, OCaml va Haskell, ular allaqachon ko'rib chiqilgan variantlardan sezilarli darajada orqada qolib ketgan va sekundiga 12 million paketni engib o'tolmagan. Swift va JavaScript drayverlari sekundiga 5 million paketli oqimlarni qayta ishlashga qodir bo'lgan holda yanada katta kechikish ko'rsatdi.

Yuqori reytingni sekundiga atigi 0.14 million paketni qayta ishlashga qodir bo'lgan Python drayveri yakunladi. Python ilovasi tarjimonlar tezligini JITsiz va maxsus optimallashtirishlarsiz baholash uchun ishlatilgan (kod CPython 3.7 yordamida bajarilgan va PyPy bilan mos emas edi, ammo ma'lumotlarni saqlash tuzilmalarini optimallashtirish ish faoliyatini taxminan 10 barobarga oshirishi mumkinligi ta'kidlangan. ).

Bundan tashqari, buferlash samaradorligi va axlat yig'uvchining ta'sirini ko'rsatish uchun kechikish sinovlari o'tkazildi. Sinovda har bir paket haydovchi tomonidan yuborilganidan keyin kechikish vaqti aniq jo'natilgan vaqtga nisbatan o'lchandi. Liderlar hali ham C va Rust drayverlari edi, ularning natijalari sekundiga 1 million paket (taxminan 20 mks) oqimi uchun deyarli farq qilmaydi. Go haydovchisi yetakchilardan bir oz ortda qoldi va 20 mks darajasida qolib, yaxshi ishladi. C# drayveri taxminan 50 mks kechikishlarni ko'rsatdi.
Eng uzoq kechikishlar JavaScript va Java drayverlari (300 mks dan ortiq kechikishlar) tomonidan ko'rsatilgan.

10 ta dasturlash tilidagi versiyalarda tarmoq drayverlarining ishlashini taqqoslash

Tadqiqot drayverlar va operatsion tizim komponentlarini C tilidan yuqori darajadagi tillarda ishlab chiqish imkoniyatini baholash uchun o'tkazildi. Hozirgi vaqtda Linux-dagi 39 ta xotira muammolaridan 40 tasi drayverlarga tegishli, shuning uchun xavfsizroq tildan foydalanish va drayverlarni yadrodan va foydalanuvchi maydoniga ko'chirish masalalari. dolzarbligicha qoladi va ishlab chiqaruvchilar allaqachon bu yo'nalishda faol tajriba o'tkazmoqda (masalan, Google OT uchun TCP stekini ishlab chiqdi. Fuşya Go tilida, CloudFlare kompaniyasi yaratdi Rust-da QUIC protokolini amalga oshirish, Apple mobil qurilmalardagi TCP stekini foydalanuvchi maydoniga ko'chirdi).

Ish jarayonida Rust tili haydovchini rivojlantirish uchun eng yaxshi nomzod degan xulosaga keldi. Rustning imkoniyatlari past darajadagi xotira boshqaruvi bilan bog'liq muammolarni C drayverlariga nisbatan taxminan 2% dan 10% gacha yo'qotish bilan bartaraf qiladi. Go va C#, shuningdek, axlat yig'ish natijasida kelib chiqqan millisekunddan past kechikish maqbul bo'lgan holatlarda tizim komponentlarini yaratish uchun mos deb hisoblanadi.

Manba: opennet.ru

a Izoh qo'shish