Ρύθμιση του πυρήνα Linux για το GlusterFS

Η μετάφραση του άρθρου ετοιμάστηκε την παραμονή της έναρξης του μαθήματος "Διαχειριστής Linux. Επαγγελματίας".

Ρύθμιση του πυρήνα Linux για το GlusterFS

Κατά καιρούς, που και που προκύπτουν ερωτήματα σχετικά με τις συστάσεις της Gluster σχετικά με την προσαρμογή του πυρήνα και κατά πόσο είναι απαραίτητη.

Αυτή η ανάγκη σπάνια προκύπτει. Ο πυρήνας αποδίδει πολύ καλά κάτω από τους περισσότερους φόρτους εργασίας. Αν και υπάρχει ένα μειονέκτημα. Ιστορικά, ο πυρήνας του Linux καταναλώνει εύκολα πολλή μνήμη εάν του δοθεί η ευκαιρία, συμπεριλαμβανομένης της προσωρινής αποθήκευσης ως πρωταρχικού μέσου βελτίωσης της απόδοσης.

Στις περισσότερες περιπτώσεις αυτό λειτουργεί εξαιρετικά, αλλά κάτω από μεγάλο φορτίο μπορεί να προκαλέσει προβλήματα.

Έχουμε μεγάλη εμπειρία στην εργασία με συστήματα που καταναλώνουν πολλή μνήμη, όπως CAD, EDA και παρόμοια, τα οποία άρχισαν να επιβραδύνουν υπό υψηλό φορτίο. Και μερικές φορές αντιμετωπίσαμε προβλήματα στο Gluster. Μετά από προσεκτική παρακολούθηση της χρησιμοποιούμενης μνήμης και του χρόνου αναμονής του δίσκου για περισσότερες από μία ημέρες, είχαμε υπερφόρτωση δίσκου, τεράστια iowait, σφάλματα πυρήνα (πυρήνας oops), παγώματα κ.λπ.

Αυτό το άρθρο είναι το αποτέλεσμα πολλών πειραμάτων συντονισμού παραμέτρων που πραγματοποιήθηκαν σε διάφορες καταστάσεις. Χάρη σε αυτές τις παραμέτρους, όχι μόνο βελτιώθηκε η ανταπόκριση γενικά, αλλά και η λειτουργία του συμπλέγματος σταθεροποιήθηκε σημαντικά.

Όσον αφορά τη διαμόρφωση της μνήμης, το πρώτο μέρος που πρέπει να κοιτάξετε είναι το υποσύστημα εικονικής μνήμης (VM), το οποίο έχει μεγάλο αριθμό επιλογών που μπορεί να σας μπερδέψουν.

vm.swappiness

Παράμετρος vm.swappiness καθορίζει πόσο ο πυρήνας χρησιμοποιεί swap σε σύγκριση με τη μνήμη RAM. Ορίζεται επίσης στον πηγαίο κώδικα ως "τάση για κλοπή αντιστοιχισμένης μνήμης". Μια υψηλή τιμή swappiness σημαίνει ότι ο πυρήνας θα είναι πιο επιρρεπής στην εναλλαγή χαρτογραφημένων σελίδων. Μια χαμηλή τιμή swappiness σημαίνει το αντίθετο: ο πυρήνας θα ανταλλάσσει σελίδες από τη μνήμη λιγότερο. Με άλλα λόγια, τόσο μεγαλύτερη είναι η τιμή vm.swappiness, τόσο περισσότερο το σύστημα θα χρησιμοποιεί swap.

Η εκτεταμένη χρήση της ανταλλαγής είναι ανεπιθύμητη, καθώς τεράστια μπλοκ δεδομένων φορτώνονται και εκφορτώνονται στη μνήμη RAM. Πολλοί άνθρωποι υποστηρίζουν ότι η τιμή swapiness θα πρέπει να είναι υψηλή, αλλά από την εμπειρία μου, η ρύθμιση της στο "0" έχει ως αποτέλεσμα καλύτερη απόδοση.

Μπορείτε να διαβάσετε περισσότερα εδώ - lwn.net/Articles/100978

Αλλά και πάλι, αυτές οι ρυθμίσεις πρέπει να χρησιμοποιούνται με προσοχή και μόνο μετά από δοκιμή της συγκεκριμένης εφαρμογής. Για εφαρμογές ροής με μεγάλη φόρτωση, αυτή η παράμετρος θα πρέπει να οριστεί σε "0". Όταν αλλάξει σε "0", η απόκριση του συστήματος βελτιώνεται.

vm.vfs_cache_pressure

Αυτή η ρύθμιση ελέγχει τη μνήμη που καταναλώνεται από τον πυρήνα για την προσωρινή αποθήκευση αντικειμένων καταλόγου και inode (οδοντοστοιχία και inode).

Με την προεπιλεγμένη τιμή 100, ο πυρήνας θα επιχειρήσει να ελευθερώσει τις κρυφές μνήμες οδοντοστοιχιών και inode με δίκαιο τρόπο στην προσωρινή μνήμη σελίδας και στην swapcache. Η μείωση του vfs_cache_pressure κάνει τον πυρήνα να διατηρήσει τις κρυφές μνήμες οδοντοστοιχιών και inode. Όταν η τιμή είναι "0", ο πυρήνας δεν θα ξεπλύνει ποτέ την κρυφή οδοντοστοιχία και την κρυφή μνήμη inode λόγω πίεσης στη μνήμη και αυτό μπορεί εύκολα να οδηγήσει σε σφάλμα εκτός μνήμης. Η αύξηση του vfs_cache_pressure πάνω από το 100 κάνει τον πυρήνα να δίνει προτεραιότητα στις σελίδες οδοντοστοιχίας και inode.

Όταν χρησιμοποιείτε το GlusterFS, πολλοί χρήστες με μεγάλο όγκο δεδομένων και πολλά μικρά αρχεία μπορούν εύκολα να χρησιμοποιήσουν σημαντική ποσότητα μνήμης RAM στον διακομιστή λόγω της προσωρινής αποθήκευσης inode/dentry, η οποία μπορεί να οδηγήσει σε κακή απόδοση καθώς ο πυρήνας πρέπει να χειριστεί δομές δεδομένων σε ένα σύστημα με 40 GB μνήμης. Η ρύθμιση αυτής της παραμέτρου σε μεγαλύτερη από 100 έχει βοηθήσει πολλούς χρήστες να επιτύχουν δικαιότερη αποθήκευση στην κρυφή μνήμη και βελτιωμένη απόκριση του πυρήνα.

vm.dirty_background_ratio και vm.dirty_ratio

Πρώτη παράμετρος (vm.dirty_background_ratio) καθορίζει το ποσοστό της μνήμης με βρώμικες σελίδες, όταν φτάσει στο οποίο είναι απαραίτητο να ξεκινήσει η έκπλυση των βρώμικων σελίδων στο φόντο στο δίσκο. Μέχρι να επιτευχθεί αυτό το ποσοστό, οι σελίδες δεν ξεπλένονται στο δίσκο. Και όταν ξεκινήσει η επαναφορά, εκτελείται στο παρασκήνιο χωρίς να διακόπτει τις διεργασίες που εκτελούνται.

Δεύτερη παράμετρος (vm.dirty_ratio) καθορίζει το ποσοστό της μνήμης που μπορεί να καταληφθεί από βρώμικες σελίδες πριν ξεκινήσει ένα αναγκαστικό φλας. Μόλις επιτευχθεί αυτό το όριο, όλες οι διεργασίες γίνονται σύγχρονες (μπλοκαρισμένες) και δεν επιτρέπεται να συνεχίσουν να εκτελούνται έως ότου ολοκληρωθεί πραγματικά η λειτουργία I/O που ζήτησαν και τα δεδομένα βρίσκονται στο δίσκο. Με υψηλό φορτίο I/O, αυτό προκαλεί πρόβλημα επειδή δεν υπάρχει προσωρινή αποθήκευση δεδομένων και όλες οι διεργασίες που κάνουν I/O μπλοκάρονται σε αναμονή για I/O. Αυτό έχει ως αποτέλεσμα μεγάλο αριθμό διεργασιών ανάρτησης, υψηλό φορτίο, αστάθεια του συστήματος και κακή απόδοση.

Η μείωση των τιμών αυτών των παραμέτρων κάνει τα δεδομένα να ξεπλένονται στο δίσκο πιο συχνά και να μην αποθηκεύονται στη μνήμη RAM. Αυτό μπορεί να βοηθήσει συστήματα με μεγάλη μνήμη, όπου είναι φυσιολογικό να ξεπλένονται οι κρυφές μνήμες σελίδων 45-90 GB στο δίσκο, με αποτέλεσμα τεράστιο λανθάνοντα χρόνο για εφαρμογές front-end, μειώνοντας τη συνολική απόκριση και τη διαδραστικότητα.

"1" > /proc/sys/vm/pagecache

Η προσωρινή μνήμη σελίδων είναι μια προσωρινή μνήμη που αποθηκεύει δεδομένα από αρχεία και εκτελέσιμα προγράμματα, δηλαδή, αυτές είναι σελίδες με το πραγματικό περιεχόμενο αρχείων ή μπλοκ συσκευών. Αυτή η κρυφή μνήμη χρησιμοποιείται για τη μείωση του αριθμού των αναγνώσεων του δίσκου. Η τιμή "1" σημαίνει ότι η κρυφή μνήμη χρησιμοποιεί το 1% της μνήμης RAM και θα υπάρχουν περισσότερες αναγνώσεις από το δίσκο παρά από τη μνήμη RAM. Δεν είναι απαραίτητο να αλλάξετε αυτήν τη ρύθμιση, αλλά εάν είστε παρανοϊκοί σχετικά με τον έλεγχο της προσωρινής μνήμης σελίδας, μπορείτε να τη χρησιμοποιήσετε.

"deadline" > /sys/block/sdc/queue/scheduler

Ο προγραμματιστής εισόδου/εξόδου είναι ένα στοιχείο του πυρήνα του Linux που χειρίζεται ουρές ανάγνωσης και εγγραφής. Θεωρητικά, είναι καλύτερο να χρησιμοποιήσετε το "noop" για έναν έξυπνο ελεγκτή RAID, επειδή το Linux δεν γνωρίζει τίποτα για τη φυσική γεωμετρία του δίσκου, επομένως είναι πιο αποτελεσματικό να αφήσετε τον ελεγκτή, ο οποίος γνωρίζει καλά τη γεωμετρία του δίσκου, να επεξεργαστεί το αίτημα ως όσο πιο γρήγορα γίνεται. Φαίνεται όμως ότι το «deadline» βελτιώνει την απόδοση. Περισσότερες πληροφορίες σχετικά με τους χρονοπρογραμματιστές μπορείτε να βρείτε στην τεκμηρίωση για τον πηγαίο κώδικα του πυρήνα Linux: linux/Documentation/block/*osched.txt. Και παρατήρησα επίσης μια αύξηση στην απόδοση ανάγνωσης κατά τη διάρκεια μικτών λειτουργιών (πολλές εγγραφές).

"256" > /sys/block/sdc/queue/nr_requests

Ο αριθμός των αιτημάτων εισόδου/εξόδου στο buffer πριν σταλούν στον προγραμματιστή. Το εσωτερικό μέγεθος ουράς ορισμένων ελεγκτών (queue_depth) είναι μεγαλύτερο από τα nr_requests του χρονοπρογραμματιστή I/O, επομένως ο προγραμματιστής I/O έχει λίγες πιθανότητες να ιεραρχήσει σωστά τα αιτήματα και να συγχωνεύσει. Για προγραμματιστές προθεσμιών και CFQ, είναι καλύτερο όταν το nr_requests είναι 2 φορές μεγαλύτερο από την εσωτερική ουρά του ελεγκτή. Η συγχώνευση και η αναδιάταξη ερωτημάτων βοηθούν τον χρονοπρογραμματιστή να ανταποκρίνεται καλύτερα σε μεγάλο φορτίο.

echo "16" > /proc/sys/vm/page-cluster

Η παράμετρος page-cluster ελέγχει τον αριθμό των σελίδων που γράφονται στο swap ταυτόχρονα. Στο παραπάνω παράδειγμα, η τιμή έχει οριστεί σε "16" για να ταιριάζει με το μέγεθος της λωρίδας RAID των 64 KB. Αυτό δεν έχει νόημα όταν swappiness = 0, αλλά εάν ορίσετε την swappiness σε 10 ή 20, τότε η χρήση αυτής της τιμής θα σας βοηθήσει όταν το μέγεθος της λωρίδας RAID είναι 64 KB.

blockdev --setra 4096 /dev/<devname> (-sdb, hdc ή dev_mapper)

Οι προεπιλεγμένες ρυθμίσεις μπλοκ συσκευής για πολλούς ελεγκτές RAID συχνά οδηγούν σε τρομερή απόδοση. Η προσθήκη της παραπάνω επιλογής διαμορφώνει την προκαταρκτική ανάγνωση για τομείς 4096*512 byte. Τουλάχιστον για τις λειτουργίες ροής, η ταχύτητα αυξάνεται με την πλήρωση της κρυφής μνήμης του δίσκου στο τσιπ μέσω ανάγνωσης εκ των προτέρων κατά τη διάρκεια της περιόδου που χρησιμοποιεί ο πυρήνας για την προετοιμασία I/O. Η κρυφή μνήμη μπορεί να περιέχει δεδομένα που θα ζητηθούν κατά την επόμενη ανάγνωση. Η υπερβολική ανάγνωση εκ των προτέρων μπορεί να σκοτώσει την τυχαία I/O για μεγάλα αρχεία, εάν καταναλώνει δυνητικά χρήσιμο χρόνο δίσκου ή φορτώνει δεδομένα εκτός της προσωρινής μνήμης.

Ακολουθούν μερικές ακόμη συστάσεις σε επίπεδο συστήματος αρχείων. Αλλά δεν έχουν δοκιμαστεί ακόμα. Βεβαιωθείτε ότι το σύστημα αρχείων σας γνωρίζει το μέγεθος της λωρίδας και τον αριθμό των δίσκων στη συστοιχία. Για παράδειγμα, ότι αυτός είναι ένας πίνακας raid5 με μέγεθος λωρίδας 64K έξι δίσκων (στην πραγματικότητα πέντε, επειδή ένας δίσκος χρησιμοποιείται για ισοτιμία). Αυτές οι συστάσεις βασίζονται σε θεωρητικές υποθέσεις και συλλέγονται από διάφορα ιστολόγια/άρθρα από ειδικούς του RAID.

-> ext4 fs, 5 disks, 64K stripe, units in 4K blocks
mkfs -text4 -E stride=$((64/4))
-> xfs, 5 disks, 64K stripe, units in 512-byte sectors
mkfs -txfs -d sunit=$((64*2)) -d swidth=$((5*64*2))

Για μεγαλύτερα αρχεία, μπορείτε να εξετάσετε το ενδεχόμενο να αυξήσετε τα παραπάνω μεγέθη λωρίδων.

ΠΡΟΣΟΧΗ! Όλα όσα περιγράφονται παραπάνω είναι εξαιρετικά υποκειμενικά για ορισμένους τύπους εφαρμογών. Αυτό το άρθρο δεν εγγυάται οποιεσδήποτε βελτιώσεις χωρίς πρώτα να δοκιμάσετε τις αντίστοιχες εφαρμογές από τον χρήστη. Θα πρέπει να χρησιμοποιείται μόνο εάν υπάρχει ανάγκη βελτίωσης της συνολικής απόκρισης του συστήματος ή εάν επιλύει τρέχοντα προβλήματα.

Πρόσθετα υλικά:

Ρύθμιση του πυρήνα Linux για το GlusterFS

Διαβάστε περισσότερα

Πηγή: www.habr.com

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