10 proqramlaşdırma dilində şəbəkə sürücüsü performansının müqayisəsi

Almaniya universitetlərindən bir qrup tədqiqatçı nəşr olundu tapıntılar eksperiment, bu müddət ərzində müxtəlif proqramlaşdırma dillərində 10 giqabitlik Intel Ixgbe (X10xx) şəbəkə kartları üçün standart drayverin 5 versiyası hazırlanmışdır. Sürücü istifadəçi məkanında işləyir və C, Rust, Go, C#, Java, OCaml, Haskell, Swift, JavaScript və Python dillərində həyata keçirilir. Kod yazarkən əsas diqqət hər bir dilin xüsusiyyətlərini nəzərə alaraq mümkün olan ən yaxşı performansa nail olmaq idi. Bütün variantlar funksionallıq baxımından eynidir və təxminən 1000 kod sətirindən ibarətdir. Layihə inkişafları yayılma BSD lisenziyası altında.

Sürücünün Rust versiyası performans baxımından C dilindəki istinad sürücüsünə çox yaxın olduğu ortaya çıxdı. 32 paketdən ibarət blokların eyni vaxtda göndərilməsi ilə bir yük altında Rust sürücüsü bir qədər geridə qaldı, lakin blok başına 32 paketdən çox olan sınaqlarda sürət C sürücüsündən praktiki olaraq fərqlənmirdi və 28 milyon emal səviyyəsində performans nümayiş etdirdi. Xeon CPU E3-1230 v2 3.3 GHz olan serverdə saniyədə paketlər.

10 proqramlaşdırma dilində şəbəkə sürücüsü performansının müqayisəsi

Performans baxımından növbəti yer kifayət qədər yaxın nəticələr göstərən Go və C# dillərindəki sürücülər tərəfindən tutuldu (Go sürücüsü 16 paketə qədər bloklarla sınaqlarda qalib gəldi və 16 paketdən çox olan testlərdə bir qədər itirməyə başladı. blokda). Blok başına 256 paketlə C# sürücüsünün pik performansı saniyədə təxminən 28 milyon paket, Go sürücüsü isə saniyədə təxminən 25 milyon paket idi.

Sonrakı, kifayət qədər yaxın nəticələrlə, sürücülər idi
Java, OCaml və Haskell, əvvəllər nəzərdən keçirilən variantlardan nəzərəçarpacaq dərəcədə geri qalır və saniyədə 12 milyon paketin öhdəsindən gələ bilməyib. Swift və JavaScript sürücüləri saniyədə 5 milyon paket səviyyəsində axınları emal edə bilərək daha böyük gecikmə göstərdilər.

Ən yüksək reytinqi saniyədə cəmi 0.14 milyon paketi emal edə bilən Python sürücüsü tamamlayıb. Python tətbiqi tərcüməçilərin sürətini JIT olmadan və xüsusi optimallaşdırmalar olmadan qiymətləndirmək üçün istifadə edilmişdir (kod CPython 3.7 istifadə edərək icra edilmişdir və PyPy ilə uyğun deyildi, lakin qeyd olunur ki, məlumat saxlama strukturlarının optimallaşdırılması performansı təxminən 10 dəfə artıra bilər. ).

Əlavə olaraq, buferləşdirmənin effektivliyini və zibil toplayıcının təsirini göstərmək üçün gecikmə testləri aparıldı. Sınaq, hər bir paketin sürücü tərəfindən göndərilməsindən sonra gecikmənin göndərildiyi dəqiq vaxtla müqayisədə ölçüldü. Liderlər hələ də C və Rust sürücüləri idi, onların nəticələri saniyədə 1 milyon paket (təxminən 20 µs) axını üçün praktiki olaraq fərqlənmirdi. Go sürücüsü liderlərdən bir qədər geri qalaraq və həmçinin 20 µs səviyyəsində qalaraq yaxşı çıxış etdi. C# sürücüsü təxminən 50 µs gecikmələr göstərdi.
Ən uzun gecikmələr JavaScript və Java sürücüləri (300 µs-dən çox gecikmə) tərəfindən göstərilmişdir.

10 proqramlaşdırma dilində şəbəkə sürücüsü performansının müqayisəsi

Tədqiqat C-dən daha yüksək səviyyəli dillərdə sürücülərin və əməliyyat sistemi komponentlərinin inkişaf etdirilməsi imkanlarını qiymətləndirmək üçün aparılmışdır. Hal-hazırda Linux-da 39 yaddaş problemindən 40-u sürücülərlə bağlıdır, buna görə də daha təhlükəsiz bir dildən istifadə və sürücülərin nüvədən və istifadəçi sahəsinə köçürülməsi məsələləri. aktual olaraq qalır və istehsalçılar artıq bu istiqamətdə fəal şəkildə təcrübə aparırlar (məsələn, Google OS üçün TCP yığını hazırlayıb. Fuchsia Go dilində, CloudFlare şirkəti yaradılmışdır Rust-da QUIC protokolunun tətbiqi ilə Apple mobil cihazlardakı TCP yığınını istifadəçi sahəsinə köçürdü).

İşin gedişində belə qənaətə gəlindi ki, Rust dili sürücünün inkişafı üçün ən yaxşı namizəddir. Rust-un imkanları aşağı səviyyəli yaddaş idarəetməsi ilə bağlı problemləri C sürücüləri ilə müqayisədə təxminən 2%-10% performans itkisi hesabına aradan qaldırır. Go və C# həm də zibilin yığılması nəticəsində yaranan sub-millisaniyə gecikməsinin məqbul olduğu vəziyyətlərdə sistem komponentləri yaratmaq üçün uyğun hesab edilir.

Mənbə: opennet.ru

Добавить комментарий