Σύγκριση απόδοσης προγραμμάτων οδήγησης δικτύου σε εκδόσεις σε 10 γλώσσες προγραμματισμού

Μια ομάδα ερευνητών από γερμανικά πανεπιστήμια опубликовала ευρήματα πείραμα, κατά την οποία αναπτύχθηκαν 10 εκδόσεις ενός τυπικού προγράμματος οδήγησης για κάρτες δικτύου Intel Ixgbe (X10xx) 5 gigabit σε διαφορετικές γλώσσες προγραμματισμού. Το πρόγραμμα οδήγησης εκτελείται στο χώρο χρήστη και υλοποιείται σε C, Rust, Go, C#, Java, OCaml, Haskell, Swift, JavaScript και Python. Κατά τη σύνταξη κώδικα, η κύρια εστίαση ήταν στην επίτευξη της καλύτερης δυνατής απόδοσης, λαμβάνοντας υπόψη τα χαρακτηριστικά κάθε γλώσσας. Όλες οι επιλογές είναι πανομοιότυπες σε λειτουργικότητα και αποτελούνται από περίπου 1000 γραμμές κώδικα. Εξελίξεις του έργου εξάπλωση υπό την άδεια BSD.

Η έκδοση Rust του προγράμματος οδήγησης αποδείχθηκε ότι ήταν πολύ κοντά σε απόδοση με το πρόγραμμα οδήγησης αναφοράς στη γλώσσα C. Κάτω από ένα φορτίο με ταυτόχρονη αποστολή μπλοκ 32 πακέτων, το πρόγραμμα οδήγησης Rust ήταν ελαφρώς πίσω, αλλά σε δοκιμές με περισσότερα από 32 πακέτα ανά μπλοκ, η ταχύτητα δεν διέφερε ουσιαστικά από το πρόγραμμα οδήγησης C και έδειξε απόδοση σε επίπεδο επεξεργασίας 28 εκατ. πακέτα ανά δευτερόλεπτο σε διακομιστή με επεξεργαστή Xeon CPU E3-1230 v2 3.3 GHz.

Σύγκριση απόδοσης προγραμμάτων οδήγησης δικτύου σε εκδόσεις σε 10 γλώσσες προγραμματισμού

Η επόμενη θέση όσον αφορά την απόδοση καταλήφθηκε από προγράμματα οδήγησης στις γλώσσες Go και C#, τα οποία παρουσίασαν αρκετά κοντινά αποτελέσματα (το πρόγραμμα οδήγησης Go κέρδισε σε δοκιμές με μπλοκ έως 16 πακέτα και άρχισε να χάνει ελαφρά σε δοκιμές με περισσότερα από 16 πακέτα σε ένα μπλοκ). Με 256 πακέτα ανά μπλοκ, η μέγιστη απόδοση του προγράμματος οδήγησης C# ήταν περίπου 28 εκατομμύρια πακέτα ανά δευτερόλεπτο και του προγράμματος οδήγησης Go ήταν περίπου 25 εκατομμύρια πακέτα ανά δευτερόλεπτο.

Στη συνέχεια, με αρκετά κοντινά αποτελέσματα, ήταν οι οδηγοί για
Java, OCaml και Haskell, που ήδη υστερούσαν αισθητά σε σχέση με τις προηγούμενες επιλογές και δεν μπορούσαν να ξεπεράσουν τα 12 εκατομμύρια πακέτα ανά δευτερόλεπτο bar. Τα προγράμματα οδήγησης Swift και JavaScript παρουσίασαν ακόμη μεγαλύτερη καθυστέρηση, καθώς ήταν σε θέση να επεξεργάζονται ροές στο επίπεδο των 5 εκατομμυρίων πακέτων ανά δευτερόλεπτο.

Η κορυφαία κατάταξη ολοκληρώθηκε από τον οδηγό Python, ο οποίος ήταν σε θέση να επεξεργαστεί μόνο 0.14 εκατομμύρια πακέτα ανά δευτερόλεπτο. Η εφαρμογή Python χρησιμοποιήθηκε για την αξιολόγηση της ταχύτητας των διερμηνέων χωρίς JIT και χωρίς συγκεκριμένες βελτιστοποιήσεις (ο κώδικας εκτελέστηκε χρησιμοποιώντας CPython 3.7 και δεν ήταν συμβατός με το PyPy, αλλά σημειώνεται ότι η βελτιστοποίηση των δομών αποθήκευσης δεδομένων θα μπορούσε να βελτιώσει την απόδοση κατά περίπου 10 φορές ).

Επιπλέον, πραγματοποιήθηκαν δοκιμές λανθάνουσας κατάστασης για να δείξουν την αποτελεσματικότητα της προσωρινής αποθήκευσης και την επίδραση του συλλέκτη απορριμμάτων. Η δοκιμή μέτρησε τον λανθάνοντα χρόνο μετά την προώθηση κάθε πακέτου από τον οδηγό σε σύγκριση με τον ακριβή χρόνο αποστολής του. Οι ηγέτες εξακολουθούσαν να είναι οι οδηγοί C και Rust, τα αποτελέσματα των οποίων ήταν πρακτικά αδιάκριτα για ροή 1 εκατομμυρίου πακέτων ανά δευτερόλεπτο (περίπου 20 µs). Ο οδηγός Go είχε καλή απόδοση, όντας ελαφρώς πίσω από τους κορυφαίους και παραμένοντας επίσης στο επίπεδο των 20 µs. Το πρόγραμμα οδήγησης C# παρουσίασε καθυστερήσεις περίπου 50 µs.
Οι μεγαλύτερες καθυστερήσεις εμφανίστηκαν από προγράμματα οδήγησης JavaScript και Java (λανθάνοντες χρόνοι άνω των 300 µs).

Σύγκριση απόδοσης προγραμμάτων οδήγησης δικτύου σε εκδόσεις σε 10 γλώσσες προγραμματισμού

Η μελέτη διεξήχθη για να αξιολογήσει τη δυνατότητα ανάπτυξης προγραμμάτων οδήγησης και στοιχείων λειτουργικού συστήματος σε γλώσσες υψηλότερου επιπέδου από τη C. Επί του παρόντος, 39 από τα 40 προβλήματα μνήμης στο Linux σχετίζονται με προγράμματα οδήγησης, επομένως τα ζητήματα της χρήσης μιας πιο ασφαλούς γλώσσας και της μετακίνησης προγραμμάτων οδήγησης εκτός του πυρήνα και στο χώρο του χρήστη παραμένουν σχετικές και οι κατασκευαστές πειραματίζονται ήδη ενεργά προς αυτή την κατεύθυνση (για παράδειγμα, η Google έχει αναπτύξει μια στοίβα TCP για το λειτουργικό σύστημα Φούξια στη γλώσσα Go, εταιρεία CloudFlare δημιουργήθηκε εφαρμογή του πρωτοκόλλου QUIC στο Rust, η Apple έχει μετακινήσει τη στοίβα TCP σε κινητές συσκευές στο χώρο χρήστη).

Κατά τη διάρκεια της εργασίας, συνήχθη το συμπέρασμα ότι η γλώσσα Rust είναι ο καλύτερος υποψήφιος για ανάπτυξη οδηγού. Οι δυνατότητες του Rust εξαλείφουν τα προβλήματα που σχετίζονται με τη διαχείριση μνήμης χαμηλού επιπέδου με κόστος περίπου 2% έως 10% απώλειας απόδοσης σε σύγκριση με τα προγράμματα οδήγησης C. Το Go και το C# θεωρούνται επίσης κατάλληλα για τη δημιουργία στοιχείων συστήματος σε καταστάσεις όπου ο λανθάνοντας χρόνος μικρότερου του χιλιοστού του δευτερολέπτου που προκαλείται από τη συλλογή σκουπιδιών είναι αποδεκτός.

Πηγή: opennet.ru

Προσθέστε ένα σχόλιο