Was ist VM.min_free_kbytes und wie man es stellt?

Was ist VM.min_free_kbytes und wie man es stellt?
Was ist VM.min_free_kBytes sysctl abstimmbar für Linux -Kernel und auf welchen Wert er eingestellt werden sollte? Wir werden diesen Parameter untersuchen und wie er sich auf ein laufendes Linux -System in diesem Artikel auswirkt. Wir werden seine Auswirkungen auf den OS -Seiten -Cache und auf Mallocs testen und wie der systemfreie Befehl zeigt, wann dieser Parameter festgelegt ist. Wir werden einige fundierte Vermutungen zu idealen Werten für dieses Abstimmungsabkommen machen und zeigen, wie VM festgelegt werden kann.min_free_kbytes dauerhaft, um Neustarts zu überleben. So lass uns gehen.

Wie VM.min_free_kbytes funktioniert

Speicherzuweisungen können vom System erforderlich sein, um die ordnungsgemäße Funktion des Systems selbst sicherzustellen. Wenn der Kernel zulässt, dass der gesamte Speicher zugewiesen wird, kann es kämpfen, wenn er Speicher für reguläre Operationen benötigt, damit das Betriebssystem reibungslos läuft. Deshalb liefert der Kernel die abstimmbare VM.min_free_kbytes. Das Abstimmbare erzwingt den Speichermanager des Kernels, mindestens x viel freier Speicher zu führen. Hier ist die offizielle Definition aus der Linux -Kernel -Dokumentation: „Dies wird verwendet, um die Linux -VM zu zwingen, eine minimale Anzahl von Kilobyten frei zu halten. Die VM verwendet diese Nummer, um einen Wasserzeichen [Wmark_Min] für jede LowMem -Zone im System zu berechnen. Jede LowMem -Zone erhält eine Reihe von reservierten kostenlosen Seiten proportional auf ihrer Größe basiert. Eine minimale Menge an Speicher ist erforderlich, um PF_Memalloc -Zuweisungen zu erfüllen. Wenn Sie dies auf niedriger als 1024 KB einstellen, wird Ihr System subtil gebrochen und anfällig für Deadlock unter hohen Lasten. Wenn Sie dies zu hoch setzen, wird Ihre Maschine sofort ausgelöst.“

VM valieren.min_free_kbytes funktioniert

Um zu testen, dass die Einstellung von min_free_kbytes wie entworfen funktioniert, habe ich eine linux -virtuelle Instanz mit nur 3 erstellt.75 GB RAM. Verwenden Sie den kostenlosen Befehl unten, um das System zu analysieren:

# frei -m

Betrachten Sie das kostenlose Speicherdienstprogramm oben mit dem Flag -m, um die Werte in MB gedruckt zu haben. Der Gesamtspeicher beträgt 3.5 bis 3.75 GB Speicher. 121 MB Speicher wird verwendet, 3.3 GB Speicher ist frei, 251 MB wird vom Puffer -Cache verwendet. Und 3.3 GB Speicher sind verfügbar.

Jetzt werden wir den Wert von VM ändern.min_free_kbytes und sehen Sie, wie sich die Auswirkungen auf den Systemspeicher haben. Wir werden den neuen Wert des Virtual -Dateisystems Proc wiedergeben, um den Kernel -Parameterwert gemäß unten zu ändern:

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

Sie können sehen, dass der Parameter in 1 geändert wurde.5 GB ungefähr und hat wirksam genommen. Jetzt verwenden wir die frei Befehl erneut, um alle vom System erkannten Änderungen zu sehen.

# frei -m

Der freie Speicher und der Puffer -Cache sind durch den Befehl unverändert, aber die Menge des Speichers wird als angezeigt verfügbar wurde von 3327 auf 1222 MB reduziert. Dies ist eine ungefähre Verringerung der Änderung des Parameters auf 1.5 GB min kostenloser Speicher.

Erstellen wir nun eine 2 -GB -Datendatei und sehen dann, welche Lesen diese Datei in den Puffer -Cache für die Werte ausführen. Hier erfahren Sie, wie Sie eine 2 GB -Datendatei in 2 Zeilen des Bash -Skripts unten erstellen. Das Skript generiert eine 35 -MB -Zufallsdatei mit dem Befehl dd und kopiert sie dann 70 Mal in ein neues Datendatei Ausgang:

# dd if =/dev/random von =/root/d1.txt count = 1000000
# für i in 'seq 1 70'; echo $ i; Katze /Wurzel /D1.txt >> /root /data_file; Erledigt

Lassen Sie uns die Datei lesen und den Inhalt ignorieren, indem Sie die Datei nach unten lesen und umleiten:

# cat data_file> /dev /null

OK, was mit diesem Set von Manöver mit unserem Systemspeicher passiert ist, überprüfen wir es jetzt:

# frei -m

Analyse der obigen Ergebnisse. Wir haben noch 1.8 GB freier Speicher, sodass der Kernel aufgrund unserer Einstellung min_free_kBytes einen großen Speicherbeteiligung geschützt hat. Der Puffer -Cache hat 1691 MB verwendet, was geringer ist als die Gesamtgröße unserer Datendatei, die 2 ist.3 GB. Anscheinend das ganze Datendatei konnte nicht im Cache gespeichert werden, da für den Puffer -Cache mangelnde Speicher verwendet werden soll. Wir können bestätigen, dass die gesamte Datei nicht im Cache gespeichert ist, sondern die wiederholten Versuche, die Datei zu lesen. Wenn es zwischengespeichert wäre, würde es einen Bruchteil einer Sekunde benötigen, um die Datei zu lesen. Lass es uns versuchen.

# Zeit Cat Data_file> /dev /null
# Zeit Cat Data_file> /dev /null

Die gelesene Datei dauerte fast 20 Sekunden, was impliziert, dass sie mit ziemlicher Sicherheit nicht alle zwischengespeichert wurde.

Als eine endgültige Validierung reduzieren wir die VM.min_free_kBytes, damit der Seitencache mehr Platz zum Betrieb hat, und wir können damit rechnen, dass der Cache funktioniert und die Datei gelesen wird, die viel schneller wird.

# echo 67584>/proc/sys/vm/min_free_kbytes
# Zeit Cat Data_file> /dev /null
# Zeit Cat Data_file> /dev /null

Mit dem zusätzlichen Speicher zum Zwischenspeichern der Datei -Lesezeit nach 20 Sekunden zuvor nach .364 Sekunden mit allem im Cache.

Ich bin gespannt, ein weiteres Experiment durchzuführen. Was passiert mit Malloc -Aufrufen, um angesichts dieses wirklich hohen VM Gedächtnis von einem C -Programm zuzuweisen.MIN_FREE_KBYTES -Einstellung. Wird es den Malloc versagen?? Wird das System sterben?? Setzen Sie zuerst die VM zurück.MIN_FREE_KBYTES -Einstellung zum wirklich hohen Wert, um unsere Experimente wieder aufzunehmen:

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

Schauen wir uns noch einmal auf unsere kostenlose Erinnerung an:

Theoretisch haben wir 1.9 GB kostenlos und 515 MB verfügbar. Verwenden wir ein Stresstestprogramm namens Stress-NG, um einen Speicher zu verwenden und zu sehen, wo wir versagen. Wir werden den VM -Tester verwenden und versuchen, 1 GB Speicher zuzuweisen. Da haben wir nur 1 reserviert.5 GB auf einem 3.75 GB System, ich denke, das sollte funktionieren.

# Stress-NG --vm 1-VM-Bytes 1G-Timeout 60s
Stress-NG: Info: [17537] Versandschweine: 1 VM
Stress-NG: Info: [17537] Cache-Zuordnung: Standard-Cache-Größe: 46080K
Stress-NG: Info: [17537] Erfolgreicher Lauf in 60 abgeschlossen.09s (1 min, 0.09 Sekunden)
# Stress-NG --vm 2-VM-Bytes 1G-Timeout 60s
# Stress-NG --vm 3-VM-Bytes 1G-Timeout 60s

Versuchen wir es noch einmal mit mehr Arbeitern, wir können 1, 2, 3, 4 Arbeiter ausprobieren und irgendwann sollte es scheitern. In meinem Test verging es mit 1 und 2 Arbeitern, scheiterte jedoch mit 3 Arbeitern.

Lassen Sie uns die VM zurücksetzen.min_free_kBytes zu einer niedrigen Zahl und prüfen Sie, ob dies uns hilft, 3 Speicherstressoren mit jeweils 1 GB auf einem 3 auszuführen.75 GB System.

# echo 67584>/proc/sys/vm/min_free_kbytes
# Stress-NG --vm 3-VM-Bytes 1G-Timeout 60s

Diesmal lief es ohne Fehler erfolgreich, ich habe es zweimal ohne Probleme ausprobiert. Ich kann also zu dem Schluss kommen, dass ein Verhaltensunterschied besteht, dass mehr Speicher für Malloc verfügbar ist, wenn die VM.min_free_kbytes -Wert wird auf einen niedrigeren Wert gesetzt.

Standardeinstellung für VM.min_free_kbytes

Der Standardwert für die Einstellung in meinem System beträgt 67584, was ungefähr 1 ist.8% des RAM auf dem System oder 64 MB. Aus Sicherheitsgründen für ein stark verprügeltes System würde ich es tendenziell ein wenig auf 128 MB erhöhen, um einen reservierten freien Speicher zu ermöglichen. Für die durchschnittliche Verwendung scheint der Standardwert jedoch sinnvoll genug zu sein. Die offizielle Dokumentation warnt davor, den Wert zu hoch zu machen. Das Einstellen auf 5 oder 10% des System -RAM ist wahrscheinlich nicht die beabsichtigte Verwendung der Einstellung und ist zu hoch.

VM einstellen.min_free_kbytes, um Neustarts zu überleben

Um sicherzustellen, dass die Einstellung Neustarts überleben kann und beim Neustart nicht den Standardwerten wiederhergestellt wird.Conf -Datei.

Abschluss

Wir haben gesehen, dass die VM.min_free_kBytes Linux -Kernel -Einstellbar kann geändert und Speicher auf dem System reservieren, um sicherzustellen. Die Standardeinstellungen sind möglicherweise etwas zu niedrig, insbesondere bei hohen Speichersystemen und sollten als sorgfältig angesehen werden. Wir haben gesehen.