Τι είναι το vm.min_free_kbytes και πώς να το συντονίσετε;

What Is Vm Min_free_kbytes



Τι είναι το vm.min_free_kbytes sysctl συντονίσιμο για τον πυρήνα linux και σε ποια τιμή πρέπει να οριστεί; Σε αυτό το άρθρο θα μελετήσουμε αυτήν την παράμετρο και πώς επηρεάζει ένα λειτουργικό σύστημα Linux. Θα δοκιμάσουμε την επίδρασή του στην προσωρινή μνήμη της σελίδας OS και στα mallocs και τι δείχνει η εντολή χωρίς σύστημα όταν οριστεί αυτή η παράμετρος. Θα κάνουμε μερικές μορφωμένες εικασίες σχετικά με τις ιδανικές τιμές για αυτό το συντονισμό και θα δείξουμε πώς να ορίσετε μόνιμα vm.min_free_kbytes για να επιβιώσετε από επανεκκινήσεις. Λοιπόν πάμε.

Πώς λειτουργεί το vm.min_free_kbytes

Το σύστημα μπορεί να χρειαστεί εκχώρηση μνήμης για να διασφαλίσει τη σωστή λειτουργία του ίδιου του συστήματος. Εάν ο πυρήνας επιτρέπει την κατανομή όλης της μνήμης, μπορεί να δυσκολευτεί όταν χρειάζεται μνήμη για κανονικές λειτουργίες για να διατηρηθεί η ομαλή λειτουργία του λειτουργικού συστήματος. Αυτός είναι ο λόγος για τον οποίο ο πυρήνας παρέχει τη δυνατότητα ρύθμισης vm.min_free_kbytes. Ο συντονισμός θα αναγκάσει τον διαχειριστή μνήμης του πυρήνα να διατηρήσει τουλάχιστον Χ ποσότητα ελεύθερης μνήμης. Εδώ είναι ο επίσημος ορισμός από το τεκμηρίωση του πυρήνα linux : Αυτό χρησιμοποιείται για να αναγκάσει το Linux VM να διατηρήσει έναν ελάχιστο αριθμό kilobytes δωρεάν. Η VM χρησιμοποιεί αυτόν τον αριθμό για να υπολογίσει μια τιμή υδατογραφήματος [WMARK_MIN] για κάθε ζώνη χαμηλών σημείων στο σύστημα. Κάθε ζώνη χαμηλού αριθμού λαμβάνει έναν αριθμό δεσμευμένων δωρεάν σελίδων ανάλογα με το μέγεθός της. Απαιτείται ελάχιστος όγκος μνήμης για την ικανοποίηση των εκχωρήσεων PF_MEMALLOC. εάν το ορίσετε σε χαμηλότερο από 1024KB, το σύστημά σας θα υποστεί διαλείμματα και θα είναι επιρρεπές σε αδιέξοδο υπό υψηλά φορτία. Ρυθμίζοντας αυτό το πολύ υψηλό, το OOM του μηχανήματός σας θα ακυρωθεί αμέσως.







Επικύρωση vm.min_free_kbytes Works

Για να ελέγξω ότι η ρύθμιση του min_free_kbytes λειτουργεί όπως έχει σχεδιαστεί, δημιούργησα μια εικονική παρουσία linux με μόνο 3,75 GB RAM. Χρησιμοποιήστε την παρακάτω δωρεάν εντολή για να αναλύσετε το σύστημα:



#Ελεύθερος



Κοιτάζοντας το βοηθητικό πρόγραμμα δωρεάν μνήμης παραπάνω χρησιμοποιώντας τη σημαία -m για να εκτυπώσετε τις τιμές σε MB. Η συνολική μνήμη είναι 3,5 έως 3,75 GB μνήμης. Χρησιμοποιείται 121 MB μνήμης, 3,3 GB μνήμης είναι δωρεάν, 251 MB χρησιμοποιείται από την προσωρινή μνήμη προσωρινής μνήμης. Και 3,3 GB μνήμης είναι διαθέσιμα.





Τώρα θα αλλάξουμε την τιμή του vm.min_free_kbytes και θα δούμε ποια είναι η επίδραση στη μνήμη του συστήματος. Θα επαναλάβουμε τη νέα τιμή στο εικονικό σύστημα αρχείων proc για να αλλάξουμε την τιμή της παραμέτρου πυρήνα σύμφωνα με τα παρακάτω:

# echo 1500000>/proc/sys/vm/min_free_kbytes
# sysctl vm.min_free_kbytes



Μπορείτε να δείτε ότι η παράμετρος άλλαξε σε 1,5 GB περίπου και έχει τεθεί σε ισχύ. Τώρα ας χρησιμοποιήσουμε το Ελεύθερος Δώστε ξανά εντολή για να δείτε τυχόν αλλαγές που αναγνωρίζονται από το σύστημα.

#Ελεύθερος

Η ελεύθερη μνήμη και η προσωρινή μνήμη προσωρινής μνήμης δεν αλλάζουν με την εντολή, αλλά ο όγκος της μνήμης εμφανίζεται ως διαθέσιμος έχει μειωθεί από 3327 σε 1222 MB. Αυτό σημαίνει κατά προσέγγιση μείωση της αλλαγής της παραμέτρου σε 1,5 GB min ελεύθερη μνήμη.

Τώρα ας δημιουργήσουμε ένα αρχείο δεδομένων 2 GB και στη συνέχεια να δούμε τι κάνει η ανάγνωση αυτού του αρχείου στην προσωρινή μνήμη προσωρινής μνήμης στις τιμές. Δείτε πώς μπορείτε να δημιουργήσετε ένα αρχείο δεδομένων 2 GB σε 2 γραμμές σεναρίου bash παρακάτω. Το σενάριο θα δημιουργήσει ένα τυχαίο αρχείο 35MB χρησιμοποιώντας την εντολή dd και στη συνέχεια θα το αντιγράψει 70 φορές σε ένα νέο φάκελος δεδομένων παραγωγή:

# dd if =/dev/random of =/root/d1.txt count = 1000000
# για i στο `seq 1 70`; do echo $ i? cat /root/d1.txt >> /root /data_file; Έγινε

Ας διαβάσουμε το αρχείο και αγνοούμε το περιεχόμενο διαβάζοντας και ανακατευθύνοντας το αρχείο στο /dev /null σύμφωνα με τα παρακάτω:

#Γάταφάκελος δεδομένων>> /dev/μηδενικό

Εντάξει, τι έχει συμβεί στη μνήμη του συστήματος μας με αυτό το σύνολο ελιγμών, ας το ελέγξουμε τώρα:

#Ελεύθερος

Αναλύοντας τα παραπάνω αποτελέσματα. Έχουμε ακόμα 1,8 GB ελεύθερης μνήμης, οπότε ο πυρήνας προστατεύει ένα μεγάλο κομμάτι μνήμης όπως έχει δεσμευτεί λόγω της ρύθμισης min_free_kbytes. Η προσωρινή μνήμη προσωρινής μνήμης έχει χρησιμοποιήσει 1691 MB, το οποίο είναι μικρότερο από το συνολικό μέγεθος του αρχείου δεδομένων μας που είναι 2,3 GB. Προφανώς ολόκληρο φάκελος δεδομένων δεν ήταν δυνατό να αποθηκευτούν στην προσωρινή μνήμη λόγω της έλλειψης διαθέσιμης μνήμης για χρήση για την προσωρινή μνήμη προσωρινής μνήμης. Μπορούμε να επιβεβαιώσουμε ότι ολόκληρο το αρχείο δεν είναι αποθηκευμένο στην προσωρινή μνήμη αλλά χρονίζει τις επαναλαμβανόμενες προσπάθειες ανάγνωσης του αρχείου. Εάν ήταν αποθηκευμένο στην προσωρινή μνήμη, θα χρειαζόταν ένα κλάσμα του δευτερολέπτου για να διαβάσει το αρχείο. Ας το προσπαθήσουμε.

# time cat data_file> /dev /null
# time cat data_file> /dev /null

Το αρχείο διαβάστηκε διήρκεσε σχεδόν 20 δευτερόλεπτα, πράγμα που σημαίνει ότι δεν είναι σχεδόν όλα αποθηκευμένα στην κρυφή μνήμη.

Ως μια τελική επικύρωση, ας μειώσουμε το vm.min_free_kbytes για να επιτρέψουμε στην προσωρινή μνήμη της σελίδας να έχει περισσότερο χώρο για λειτουργία και αναμένουμε να δούμε την προσωρινή μνήμη να λειτουργεί και το αρχείο να διαβάζεται πολύ πιο γρήγορα.

# echo 67584>/proc/sys/vm/min_free_kbytes
# time cat data_file> /dev /null
# time cat data_file> /dev /null

Με την επιπλέον μνήμη που είναι διαθέσιμη για προσωρινή αποθήκευση, ο χρόνος ανάγνωσης του αρχείου μειώθηκε από 20 δευτερόλεπτα πριν σε .364 δευτερόλεπτα με όλα αυτά στην προσωρινή μνήμη.

Είμαι περίεργος να κάνω ένα άλλο πείραμα. Τι συμβαίνει με τις κλήσεις malloc για εκχώρηση μνήμης από ένα πρόγραμμα C μπροστά σε αυτήν την πραγματικά υψηλή ρύθμιση vm.min_free_kbytes. Θα αποτύχει το malloc; Θα πεθάνει το σύστημα; Αρχικά επαναφέρετε τη ρύθμιση vm.min_free_kbytes στην πραγματικά υψηλή τιμή για να συνεχίσετε τα πειράματά μας:

#πέταξε έξω 1500000 >> /τοις εκατό/sys/vm/min_free_kbytes

Ας δούμε ξανά τη δωρεάν μνήμη μας:

Θεωρητικά έχουμε 1,9 GB δωρεάν και 515 MB διαθέσιμα. Ας χρησιμοποιήσουμε ένα πρόγραμμα δοκιμών πίεσης που ονομάζεται stress-ng για να χρησιμοποιήσουμε λίγη μνήμη και να δούμε πού αποτυγχάνουμε. Θα χρησιμοποιήσουμε τον ελεγκτή vm και θα προσπαθήσουμε να διαθέσουμε 1 GB μνήμης. Δεδομένου ότι έχουμε κρατήσει μόνο 1,5 GB σε σύστημα 3,75 GB, υποθέτω ότι αυτό πρέπει να λειτουργήσει.

# stress-ng --vm 1 --vm-bytes 1G-timeout 60s
άγχος: πληροφορίες:[17537]αποστολή γουρουνιών:1vm
άγχος: πληροφορίες:[17537]εκχώρηση cache: προεπιλεγμένο μέγεθος cache: 46080K
άγχος: πληροφορίες:[17537]ολοκληρώθηκε η επιτυχημένη πορείασε60.09s(1λεπτό,0,09ξηρός)
# stress-ng --vm 2 --vm-bytes 1G-timeout 60s
# stress-ng --vm 3 --vm-bytes 1G-timeout 60s

Ας το δοκιμάσουμε ξανά με περισσότερους εργαζόμενους, μπορούμε να δοκιμάσουμε 1, 2, 3, 4 εργάτες και κάποια στιγμή θα πρέπει να αποτύχει. Στη δοκιμή μου πέρασε με 1 και 2 εργάτες αλλά απέτυχε με 3 εργάτες.

Ας επαναφέρουμε το vm.min_free_kbytes σε χαμηλό αριθμό και θα δούμε αν αυτό μας βοηθά να τρέξουμε 3 παράγοντες πίεσης μνήμης με 1 GB ο καθένας σε σύστημα 3,75 GB.

# echo 67584>/proc/sys/vm/min_free_kbytes
# stress-ng --vm 3 --vm-bytes 1G-timeout 60s

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

Προεπιλεγμένη ρύθμιση για vm.min_free_kbytes

Η προεπιλεγμένη τιμή για τη ρύθμιση στο σύστημά μου είναι 67584 που είναι περίπου 1,8% της μνήμης RAM στο σύστημα ή 64 MB. Για λόγους ασφαλείας σε ένα σύστημα με έντονη θραύση, θα έτεινα να το αυξήσω λίγο ίσως στα 128MB για να επιτρέψω περισσότερη δεσμευμένη ελεύθερη μνήμη, ωστόσο για τη μέση χρήση η προεπιλεγμένη τιμή φαίνεται αρκετά λογική. Η επίσημη τεκμηρίωση προειδοποιεί για την υπερβολικά υψηλή τιμή. Η ρύθμισή της στο 5 ή 10% της μνήμης RAM του συστήματος πιθανότατα δεν είναι η προβλεπόμενη χρήση της ρύθμισης και είναι πολύ υψηλή.

Ρύθμιση vm.min_free_kbytes για επιβίωση επανεκκινήσεων

Προκειμένου να διασφαλιστεί ότι η ρύθμιση μπορεί να επιβιώσει επανεκκινήσεις και δεν επανέρχεται στις προεπιλεγμένες τιμές κατά την επανεκκίνηση, φροντίστε να διατηρήσετε τη ρύθμιση sysctl τοποθετώντας την επιθυμητή νέα τιμή στο αρχείο /etc/sysctl.conf.

συμπέρασμα

Έχουμε δει ότι ο συντονισμός πυρήνα linux vm.min_free_kbytes μπορεί να τροποποιηθεί και να διατηρήσει μνήμη στο σύστημα, προκειμένου να διασφαλιστεί ότι το σύστημα είναι πιο σταθερό, ειδικά κατά τη βαριά χρήση και τις μεγάλες κατανομές μνήμης. Οι προεπιλεγμένες ρυθμίσεις μπορεί να είναι λίγο πολύ χαμηλές, ειδικά σε συστήματα υψηλής μνήμης και θα πρέπει να θεωρηθούν ότι αυξάνονται προσεκτικά. Έχουμε δει ότι η μνήμη που διατηρείται από αυτό το συντονισμό εμποδίζει την προσωρινή μνήμη του λειτουργικού συστήματος να χρησιμοποιεί όλη τη μνήμη και επίσης εμποδίζει ορισμένες λειτουργίες malloc να χρησιμοποιούν επίσης όλη τη μνήμη.