Facebook ανοιχτού κώδικα Cinder, ένα πιρούνι του CPython που χρησιμοποιείται από το Instagram

Το Facebook δημοσίευσε τον πηγαίο κώδικα για το Project Cinder, ένα fork του CPython 3.8.5, της κύριας υλοποίησης αναφοράς της γλώσσας προγραμματισμού Python. Το Cinder χρησιμοποιείται στην υποδομή παραγωγής του Facebook για να τροφοδοτήσει το Instagram και περιλαμβάνει βελτιστοποιήσεις για τη βελτίωση της απόδοσης.

Ο κώδικας δημοσιεύεται για να συζητήσει τη δυνατότητα μεταφοράς των προετοιμασμένων βελτιστοποιήσεων στο κύριο πλαίσιο CPython και για να βοηθήσει άλλα έργα που εμπλέκονται στη βελτίωση της απόδοσης του CPython. Το Facebook δεν σκοπεύει να υποστηρίξει το Cinder με τη μορφή ξεχωριστού έργου ανοιχτού κώδικα και ο κώδικας παρουσιάζεται με τη μορφή που χρησιμοποιείται στην υποδομή της εταιρείας, χωρίς πρόσθετο χτένισμα και τεκμηρίωση. Επίσης, δεν προσπαθούν να προωθήσουν το Cinder ως εναλλακτική λύση στο CPython - ο κύριος στόχος της ανάπτυξης είναι η επιθυμία να βελτιώσουν το ίδιο το CPython.

Ο κώδικας Cinder σημειώνεται ως αρκετά αξιόπιστος και δοκιμασμένος σε περιβάλλοντα παραγωγής, αλλά εάν εντοπιστούν προβλήματα, θα πρέπει να τα λύσετε μόνοι σας, καθώς το Facebook δεν εγγυάται ότι θα ανταποκρίνεται σε εξωτερικά μηνύματα λάθους και θα τραβάει αιτήματα. Ταυτόχρονα, το Facebook δεν αποκλείει την εποικοδομητική συνεργασία με την κοινότητα και είναι έτοιμο να συζητήσει ιδέες για το πώς να κάνει το Cinder ακόμα πιο γρήγορο ή πώς να επιταχύνει τη μεταφορά των προετοιμασμένων αλλαγών στο κύριο μέρος του CPython.

Κύριες βελτιστοποιήσεις που εφαρμόστηκαν στο Cinder:

  • Ενσωματωμένη προσωρινή αποθήκευση bytecode («σκιώδης bytecode»). Η ουσία της μεθόδου είναι ο εντοπισμός καταστάσεων όπου εκτελείται ένας τυπικός κώδικας λειτουργίας που μπορεί να βελτιστοποιηθεί και η δυναμική αντικατάσταση ενός τέτοιου κωδικού με πιο γρήγορες εξειδικευμένες επιλογές (για παράδειγμα, αντικατάσταση συναρτήσεων που ονομάζονται συχνά).
  • Πρόθυμη αξιολόγηση κορουτίνας. Για κλήσεις ασύγχρονων συναρτήσεων που υποβάλλονται σε άμεση επεξεργασία (η αναμονή δεν οδηγεί σε αναμονή και η συνάρτηση φτάνει νωρίτερα στη δήλωση επιστροφής), το αποτέλεσμα τέτοιων συναρτήσεων αντικαθίσταται απευθείας χωρίς να δημιουργείται μια κορουτίνα ή να περιλαμβάνει βρόχο συμβάντος. Στον κώδικα του Facebook που χρησιμοποιεί σε μεγάλο βαθμό async/wait, η βελτιστοποίηση οδηγεί σε επιτάχυνση περίπου 5%.
  • Επιλεκτική μεταγλώττιση JIT σε επίπεδο επιμέρους μεθόδων και συναρτήσεων (μέθοδος-α-χρόνια). Ενεργοποιείται μέσω της επιλογής “-X jit” ή της μεταβλητής περιβάλλοντος PYTHONJIT=1 και σας επιτρέπει να επιταχύνετε την εκτέλεση πολλών δοκιμών απόδοσης κατά 1.5-4 φορές. Δεδομένου ότι η μεταγλώττιση JIT είναι σχετική μόνο για συναρτήσεις που εκτελούνται συχνά, δεν συνιστάται η χρήση της για συναρτήσεις που χρησιμοποιούνται σπάνια, η επιβάρυνση της μεταγλώττισης των οποίων μπορεί μόνο να επιβραδύνει την εκτέλεση του προγράμματος.

    Μέσω της επιλογής "-X jit-list-file=/path/to/jitlist.txt" ή της μεταβλητής περιβάλλοντος "PYTHONJITLISTFILE=/path/to/jitlist.txt" μπορείτε να καθορίσετε ένα αρχείο με μια λίστα συναρτήσεων για τις οποίες το JIT μπορεί να χρησιμοποιηθεί (μορφή διαδρομής .to.module:funcname ή path.to.module:ClassName.method_name). Ο κατάλογος των λειτουργιών για τις οποίες πρέπει να ενεργοποιηθεί το JIT μπορεί να καθοριστεί με βάση τα αποτελέσματα του προφίλ. Στο μέλλον, αναμένεται υποστήριξη για δυναμική μεταγλώττιση JIT με βάση την εσωτερική ανάλυση της συχνότητας των κλήσεων συναρτήσεων, αλλά λαμβάνοντας υπόψη τις ιδιαιτερότητες της εκκίνησης διαδικασιών στο Instagram, η μεταγλώττιση JIT είναι επίσης κατάλληλη για το Facebook στο αρχικό στάδιο.

    Το JIT μετατρέπει πρώτα τον bytecode Python σε μια ενδιάμεση αναπαράσταση υψηλού επιπέδου (HIR), η οποία είναι αρκετά κοντά στον bytecode Python, αλλά έχει σχεδιαστεί για να χρησιμοποιεί μια εικονική μηχανή που βασίζεται σε μητρώο αντί για μια στοίβα και χρησιμοποιεί επίσης πληροφορίες τύπου και πρόσθετες κρίσιμες για την απόδοση λεπτομέρειες (όπως η καταμέτρηση αναφορών) . Στη συνέχεια, το HIR μετατρέπεται σε φόρμα SSA (στατική μονή ανάθεση) και περνά από βήματα βελτιστοποίησης που λαμβάνουν υπόψη τα αποτελέσματα μέτρησης αναφοράς και τα δεδομένα κατανάλωσης μνήμης. Ως αποτέλεσμα, δημιουργείται μια ενδιάμεση αναπαράσταση χαμηλού επιπέδου (LIR), κοντά στη γλώσσα συναρμολόγησης. Μετά από μια άλλη φάση βελτιστοποιήσεων που βασίζονται σε LIR, δημιουργούνται οδηγίες συναρμολόγησης χρησιμοποιώντας τη βιβλιοθήκη asmjit.

  • Αυστηρή λειτουργία για μονάδες. Η λειτουργικότητα περιλαμβάνει τρία στοιχεία: Τύπος StrictModule. Ένας στατικός αναλυτής που μπορεί να προσδιορίσει ότι η εκτέλεση μιας ενότητας δεν έχει καμία επίδραση στον κώδικα εκτός αυτής της ενότητας. Ένας φορτωτής μονάδων που καθορίζει ότι οι λειτουργικές μονάδες βρίσκονται σε αυστηρή λειτουργία (ο κώδικας καθορίζει "εισαγωγή __strict__"), ελέγχει την απουσία τομών με άλλες μονάδες και φορτώνει αυστηρές μονάδες σε sys.modules ως αντικείμενο StrictModule.
  • Το Static Python είναι ένας πειραματικός μεταγλωττιστής bytecode που χρησιμοποιεί σχολιασμούς τύπου για να δημιουργήσει συγκεκριμένο τύπο bytecode που εκτελείται πιο γρήγορα χάρη στη μεταγλώττιση JIT. Σε ορισμένες δοκιμές, ο συνδυασμός Static Python και JIT επιδεικνύει βελτιώσεις απόδοσης έως και 7 φορές σε σύγκριση με το τυπικό CPython. Σε πολλές περιπτώσεις, τα αποτελέσματα εκτιμάται ότι είναι κοντά στη χρήση των μεταγλωττιστών MyPyC και Cython.

Πηγή: opennet.ru

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