10 programlama dilindeki sürümlerde ağ sürücüsü performansının karşılaştırılması

Alman üniversitelerinden bir grup araştırmacı yayınlanan bulgular deney10 gigabit Intel Ixgbe (X10xx) ağ kartları için standart sürücünün farklı programlama dillerinde 5 sürümü geliştirildi. Sürücü kullanıcı alanında çalışır ve C, Rust, Go, C#, Java, OCaml, Haskell, Swift, JavaScript ve Python'da uygulanır. Kod yazarken asıl odak noktası, her dilin özelliklerini dikkate alarak mümkün olan en iyi performansı elde etmekti. Tüm seçenekler işlevsellik açısından aynıdır ve yaklaşık 1000 satır koddan oluşur. Proje geliştirmeleri yayılmış BSD lisansı altında.

Sürücünün Rust sürümünün performans açısından C dilindeki referans sürücüye çok yakın olduğu ortaya çıktı. 32 paketlik blokların eşzamanlı gönderildiği yük altında Rust sürücüsü biraz geride kaldı, ancak blok başına 32'den fazla paket içeren testlerde hız neredeyse C sürücüsünden farklı değildi ve 28 milyon işlem seviyesinde performans gösterdi Xeon CPU E3-1230 v2 3.3 GHz'e sahip bir sunucuda saniyede paket sayısı.

10 programlama dilindeki sürümlerde ağ sürücüsü performansının karşılaştırılması

Performans açısından bir sonraki niş, oldukça yakın sonuçlar veren Go ve C# dillerindeki sürücüler tarafından işgal edildi (Go sürücüsü, 16 pakete kadar bloklarla yapılan testlerde kazandı ve 16'dan fazla paket içeren testlerde biraz kaybetmeye başladı) bir blokta). Blok başına 256 paket ile C# sürücüsünün en yüksek performansı saniyede yaklaşık 28 milyon paket, Go sürücüsünün ise saniyede yaklaşık 25 milyon paketti.

Daha sonra, oldukça yakın sonuçlarla, itici güçler geldi.
Daha önce dikkate alınan seçeneklerin zaten gözle görülür şekilde gerisinde kalan ve saniyede 12 milyon paket çubuğunun üstesinden gelemeyen Java, OCaml ve Haskell. Swift ve JavaScript sürücüleri, akışları saniyede 5 milyon paket düzeyinde işleyerek daha da büyük bir gecikme gösterdi.

En üst sırayı saniyede yalnızca 0.14 milyon paket işleyebilen Python sürücüsü tamamladı. Python uygulaması, tercümanların hızını JIT olmadan ve belirli optimizasyonlar olmadan değerlendirmek için kullanıldı (kod CPython 3.7 kullanılarak yürütüldü ve PyPy ile uyumlu değildi, ancak veri depolama yapılarının optimizasyonunun performansı yaklaşık 10 kat artırabileceği belirtiliyor) ).

Ek olarak, ara belleğe almanın etkinliğini ve çöp toplayıcının etkisini göstermek için gecikme testleri yapıldı. Test, her paketin sürücü tarafından iletilmesinden sonraki gecikmeyi, gönderildiği tam zamana kıyasla ölçtü. Liderler hâlâ C ve Rust sürücüleriydi; bunların sonuçları, saniyede 1 milyon paketlik (yaklaşık 20 µs) akış için neredeyse ayırt edilemezdi. Go sürücüsü, liderlerin sadece biraz gerisinde kalarak ve 20 µs seviyesinde kalarak iyi bir performans sergiledi. C# sürücüsü yaklaşık 50 µs'lik gecikmeler gösterdi.
En uzun gecikmeler JavaScript ve Java sürücüleri tarafından gösterildi (300 µs'den fazla gecikmeler).

10 programlama dilindeki sürümlerde ağ sürücüsü performansının karşılaştırılması

Çalışma, sürücülerin ve işletim sistemi bileşenlerinin C'den daha yüksek seviyeli dillerde geliştirilme olasılığını değerlendirmek için yapıldı. Şu anda Linux'taki 39 bellek probleminden 40'u sürücülerle ilgilidir, dolayısıyla daha güvenli bir dil kullanma ve sürücüleri çekirdekten kullanıcı alanına taşıma sorunları alakalı kalmak ve üreticiler zaten bu yönde aktif olarak deneyler yapıyor (örneğin, Google, işletim sistemi için bir TCP yığını geliştirdi) Fuşya Go dilinde, CloudFlare şirketi yaratıldı QUIC protokolünün Rust'ta uygulanmasıyla Apple, mobil cihazlardaki TCP yığınını kullanıcı alanına taşımıştır).

Çalışma sırasında Rust dilinin sürücü gelişimi için en iyi aday olduğu sonucuna varıldı. Rust'un yetenekleri, C sürücülerine kıyasla yaklaşık %2 ila %10 performans kaybı pahasına düşük seviyeli bellek yönetimiyle ilişkili sorunları ortadan kaldırır. Go ve C#'ın, çöp toplamanın neden olduğu milisaniyenin altındaki gecikmenin kabul edilebilir olduğu durumlarda sistem bileşenleri oluşturmak için de uygun olduğu düşünülmektedir.

Kaynak: opennet.ru

Yorum ekle