Ο Romano Gushchin (μηχανικός λογισμικού του Facebook) κατέγραψε ένα σύνολο ενημερώσεων κώδικα (patches) στην εφαρμογή κατανομής μνήμης του προγράμματος οδήγησης slab (ένας ελεγκτής μνήμης) στη λίστα αλληλογραφίας ανάπτυξης πυρήνα Linux.
Το νέο πρόγραμμα οδήγησης είναι αξιοσημείωτο για τη μετακίνηση της λογιστικής slab από το επίπεδο των σελίδων μνήμης στο επίπεδο των αντικειμένων πυρήνα, καθιστώντας δυνατή την κοινή χρήση σελίδων slab σε διαφορετικές c-ομάδες, αντί να εκχωρούνται ξεχωριστές cache slab για κάθε c-ομάδα.
Ο Roman βρήκε αυτό που αποκαλεί "πολύ σοβαρό ελάττωμα" στον υπάρχοντα ελεγκτή μνήμης πλακών που οδηγεί σε χαμηλή χρήση αυτές τις μέρες με cgroups.
«Ο πραγματικός λόγος για τον οποίο η υπάρχουσα διάταξη οδηγεί σε χαμηλή χρήση πλακών είναι απλή: οι σελίδες πλακών χρησιμοποιούνται αποκλειστικά από μια ομάδα μνήμης.
Εάν υπάρχουν μόνο λίγες εκχωρήσεις ενός συγκεκριμένου μεγέθους που πραγματοποιείται από μια ομάδα, ή εάν απομένουν κάποια ενεργά αντικείμενα μετά την κατάργηση της ομάδας, ή η ομάδα περιλαμβάνει μια εφαρμογή με σπείρωμα που μόλις εκχωρεί αντικείμενα πυρήνα, αλλά κάθε φορά μια νέα CPU: σε όλες αυτές τις περιπτώσεις, η προκύπτουσα χρήση πλακών είναι πολύ χαμηλή.
Εάν η λογιστική kmem είναι απενεργοποιημένη, ο πυρήνας μπορεί να χρησιμοποιήσει ελεύθερο χώρο σε σελίδες πλακών για άλλες εκχωρήσεις. «
Ο ελεγκτής μνήμης Slab που προτάθηκε από τον Romano Gushchin πέρυσι ήταν αρκετά πολλά υποσχόμενος, καθώς επιτρέπει αυξημένη απόδοση στη χρήση της slab, μειώνει το μέγεθος της μνήμης που χρησιμοποιείται για την slab κατά 30-45% και μειώνει σημαντικά τη συνολική κατανάλωση μνήμης του πυρήνα.
Επιπλέον, τα εφαρμοσμένα patches έχουν δείξει ότι το Facebook χρησιμοποιεί ήδη τον κώδικα σε παραγωγή στους διακομιστές του και εξοικονομεί ~650-700MB+ για διακομιστές web front-end , προσωρινή αποθήκευση βάσεων δεδομένων και διακομιστές DNS, μεταξύ άλλων πλεονεκτημάτων.
Η μείωση του αριθμού των μη κινητών πλακών έχει επίσης θετική επίδραση στον κατακερματισμό της μνήμης. Ο νέος ελεγκτής μνήμης απλοποιεί σημαντικά τον κώδικα για την καταγραφή των πλακών και εξαλείφει την ανάγκη για πολύπλοκους αλγόριθμους για τη δυναμική δημιουργία και διαγραφή προσωρινών μνημών πλακών για κάθε ομάδα c.
Όλα τα cgroups για μνήμη στη νέα υλοποίηση χρησιμοποιούν ένα κοινό σύνολο πλακών caches και η διάρκεια ζωής των πλακών caches δεν συνδέεται πλέον με τη διάρκεια ζωής των περιορισμών μνήμης που έχουν τεθεί μέσω του cgroup.
Η ακριβέστερη λογιστική των πόρων που εφαρμόζεται στον νέο ελεγκτή πλακών θα πρέπει θεωρητικά να φορτώσει την CPU περισσότερο, αλλά στην πράξη οι διαφορές αποδείχθηκαν αμελητέες.
Συγκεκριμένα, ο νέος ελεγκτής slab χρησιμοποιείται εδώ και αρκετούς μήνες σε ενεργούς διακομιστές του Facebook που χειρίζονται διαφορετικούς τύπους φορτίων και μέχρι στιγμής δεν έχουν εντοπιστεί σημαντικές παλινδρομήσεις.
Το έμπλαστρο περιέχει μερικά ημι-ανεξάρτητα μέρη, τα οποία μπορούν επίσης να βρουν τη χρήση τους εκτός του ελεγκτή μνήμης της πλάκας:
- Το Subpage Load API, το οποίο μπορεί να χρησιμοποιηθεί στο μέλλον για την καταμέτρηση άλλων αντικειμένων που δεν είναι το μέγεθος μιας σελίδας, για παράδειγμα κατανομές percpu
- Το mem_cgroup_ptr API, όπου οι δείκτες υπολογίζονται σε ένα memcg, μπορούν να επαναχρησιμοποιηθούν για αποτελεσματική επανόρθωση άλλων αντικειμένων, για παράδειγμα pagecache.
Ταυτόχρονα, παρατηρείται σημαντική μείωση στην κατανάλωση μνήμης : σε ορισμένους κεντρικούς υπολογιστές ήταν δυνατή η εξοικονόμηση έως και 1 GB μνήμης, αλλά αυτός ο δείκτης εξαρτάται σε μεγάλο βαθμό από τη φύση του φορτίου, το συνολικό μέγεθος της μνήμης RAM, την ποσότητα της CPU και τα χαρακτηριστικά της εργασίας με τη μνήμη.
Αντί να δημιουργήσετε ένα ξεχωριστό σύνολο kmem_caches για κάθε ομάδα μνήμης, χρησιμοποιούνται δύο καθολικά σύνολα: το root set για μη μετρημένο και το root set cgroup assignments και το δεύτερο σετ για όλες τις άλλες εργασίες. Αυτό επιτρέπει την απλοποίηση της διαχείρισης διάρκειας ζωής μεμονωμένων kmem_caches.
Τέλος, αν ενδιαφέρεστε να μάθετε για το νέο σύνολο των 19 ενημερώσεων κώδικα, μπορείτε να το βρείτε στη λίστα αλληλογραφίας του πυρήνα.