Perbandingan kinerja driver jaringan dalam 10 bahasa pemrograman

Sekelompok peneliti dari universitas Jerman ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π»Π° Temuan percobaan, di mana 10 varian driver tipikal untuk kartu jaringan Intel Ixgbe (X10xx) 5 gigabit dikembangkan dalam berbagai bahasa pemrograman. Driver berjalan di ruang pengguna dan diimplementasikan dalam C, Rust, Go, C#, Java, OCaml, Haskell, Swift, JavaScript, dan Python. Saat menulis kode, fokusnya adalah mencapai performa setinggi mungkin, dengan mempertimbangkan karakteristik setiap bahasa. Dalam hal fungsionalitas, semua opsi identik dan terdiri dari sekitar 1000 baris kode. Pencapaian proyek sebaran di bawah lisensi BSD.

Versi Rust dari driver memiliki kinerja yang sangat mirip dengan driver referensi C. Dengan beban dengan satu pengiriman blok 32 paket, driver Rust sedikit tertinggal, tetapi dalam pengujian dengan lebih dari 32 paket per blok, kecepatannya praktis tidak berbeda dari driver C dan menunjukkan kinerja pada tingkat pemrosesan 28 juta paket per detik di server dengan CPU Xeon E3-1230 v2 3.3 GHz.

Perbandingan kinerja driver jaringan dalam 10 bahasa pemrograman

Ceruk berikutnya dalam hal kinerja ditempati oleh driver Go dan C#, yang menunjukkan hasil yang cukup dekat (driver Go menang dalam pengujian dengan blok yang menyertakan hingga 16 paket, dan mulai kalah sedikit dalam pengujian dengan lebih dari 16 paket dalam satu memblokir). Dengan 256 paket per blok, kinerja puncak untuk driver C# kira-kira 28Mpps, dan untuk driver Go, kira-kira 25Mpps.

Selanjutnya dengan hasil yang cukup dekat, disusul dengan driver for
Java, OCaml dan Haskell, yang sudah terlihat di belakang opsi yang dipertimbangkan sebelumnya dan tidak dapat mengatasi batas 12 juta paket per detik. Driver berbasis Swift dan JavaScript menunjukkan backlog yang lebih besar, yang mampu memproses aliran pada level 5 juta paket per detik.

Pengemudi dalam bahasa Python menutup peringkat, yang hanya mampu memproses 0.14 juta paket per detik. Implementasi Python digunakan untuk mengevaluasi kecepatan juru bahasa tanpa JIT dan tanpa pengoptimalan khusus (kode dijalankan menggunakan CPython 3.7 dan tidak kompatibel dengan PyPy, tetapi perlu dicatat bahwa pengoptimalan struktur data dapat meningkatkan kinerja sekitar 10 kali lipat).

Selain itu, uji latensi dilakukan, yang menunjukkan keefektifan buffering dan dampak dari pengumpul sampah. Tes ini mengukur latensi setelah setiap paket dialihkan oleh driver, dibandingkan dengan waktu pengiriman yang diketahui. Pemimpinnya masih driver C dan Rust, yang hasilnya hampir tidak bisa dibedakan untuk aliran 1 juta paket per detik (sekitar 20 Β΅s). Pengemudi dalam bahasa Go bekerja dengan baik, yang hanya sedikit di belakang para pemimpin dan juga bertahan di level 20 Β΅s. Driver C# menunjukkan penundaan sekitar 50 Β΅s.
Driver berbasis JavaScript dan Java menunjukkan penundaan terbesar (penundaan lebih dari 300 Β΅s).

Perbandingan kinerja driver jaringan dalam 10 bahasa pemrograman

Studi ini dilakukan untuk mengevaluasi kemungkinan pengembangan driver dan komponen sistem operasi dalam bahasa dengan level yang lebih tinggi dari C. Saat ini, 39 dari 40 masalah memori Linux terkait dengan driver, jadi masalah pengadopsian bahasa yang lebih aman dan pemindahan driver dari kernel ke ruang pengguna tetap relevan dan pabrikan sudah secara aktif bereksperimen ke arah ini (misalnya, Google telah mengembangkan tumpukan TCP untuk OS Fuchsia di Go, CloudFlare dibuat penerapan protokol QUIC di Rust, Apple memindahkan tumpukan TCP pada perangkat seluler ke ruang pengguna).

Selama pekerjaan yang dilakukan, disimpulkan bahwa bahasa Rust adalah kandidat terbaik untuk pengembangan driver. Fitur-fitur yang disediakan oleh Rust memungkinkan Anda untuk menyingkirkan masalah yang timbul akibat penanganan memori tingkat rendah, dengan biaya penalti kinerja sekitar 2%-10% dibandingkan dengan driver bahasa C. Go dan C# juga cocok untuk membangun komponen sistem dalam situasi di mana latensi sub-milidetik yang disebabkan oleh pengumpul sampah dapat diterima.

Sumber: opennet.ru

Tambah komentar