Was ist vm.min_free_kbytes und wie kann ich es optimieren?

What Is Vm Min_free_kbytes

Was ist vm.min_free_kbytes sysctl für den Linux-Kernel einstellbar und auf welchen Wert sollte es eingestellt werden? In diesem Artikel werden wir diesen Parameter und seine Auswirkungen auf ein laufendes Linux-System untersuchen. Wir werden seine Auswirkungen auf den Seitencache des Betriebssystems und auf Mallocs testen und was der Befehl system free anzeigt, wenn dieser Parameter gesetzt ist. Wir werden einige fundierte Vermutungen über die idealen Werte für dieses Tunable anstellen und zeigen, wie man vm.min_free_kbytes dauerhaft festlegt, um Neustarts zu überstehen. So lass uns gehen.

So funktioniert vm.min_free_kbytes

Speicherzuweisungen können vom System benötigt werden, um das ordnungsgemäße Funktionieren des Systems selbst sicherzustellen. Wenn der Kernel die Zuweisung des gesamten Speichers zulässt, kann es sein, dass er Probleme hat, Speicher für den regulären Betrieb zu benötigen, um den reibungslosen Betrieb des Betriebssystems zu gewährleisten. Aus diesem Grund stellt der Kernel den einstellbaren vm.min_free_kbytes bereit. Die Tunable zwingt den Speichermanager des Kernels, mindestens X freien Speicher zu behalten. Hier ist die offizielle Definition aus dem Linux-Kernel-Dokumentation : Dies wird verwendet, um die Linux-VM zu zwingen, eine Mindestanzahl von Kilobytes frei zu halten. Die VM verwendet diese Zahl, um einen Wasserzeichenwert [WMARK_MIN] für jede Lowmem-Zone im System zu berechnen. Jede Lowmem-Zone erhält proportional zu ihrer Größe eine Anzahl reservierter kostenloser Seiten. Es wird eine minimale Speichermenge benötigt, um die PF_MEMALLOC-Zuweisungen zu erfüllen; Wenn Sie dies auf weniger als 1024 KB einstellen, wird Ihr System subtil kaputt und anfällig für Deadlocks unter hoher Last. Wenn Sie diesen Wert zu hoch einstellen, wird Ihr Gerät sofort OOM.



Validierung von vm.min_free_kbytes funktioniert

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



#kostenlos -m



Betrachten Sie das obige Dienstprogramm für freien Speicher, indem Sie das Flag -m verwenden, um die Werte in MB auszugeben. Der Gesamtspeicher beträgt 3,5 bis 3,75 GB Arbeitsspeicher. 121 MB Speicher werden verwendet, 3,3 GB Speicher sind frei, 251 MB werden vom Puffercache verwendet. Und 3,3 GB Speicher stehen zur Verfügung.

Jetzt werden wir den Wert von vm.min_free_kbytes ändern und sehen, wie sich dies auf den Systemspeicher auswirkt. Wir werden den neuen Wert an das virtuelle Dateisystem proc zurückgeben, um den Kernel-Parameterwert wie folgt zu ändern:

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



Sie können sehen, dass der Parameter auf ungefähr 1,5 GB geändert wurde und wirksam ist. Jetzt verwenden wir die kostenlos Befehl erneut, um alle vom System erkannten Änderungen anzuzeigen.

#kostenlos -m

Der freie Speicher und der Puffercache bleiben durch den Befehl unverändert, aber die Speichermenge wird als erhältlich wurde von 3327 auf 1222 MB reduziert. Das ist eine ungefähre Reduzierung der Änderung des Parameters auf 1,5 GB min freier Speicher.

Lassen Sie uns nun eine 2-GB-Datendatei erstellen und dann sehen, was das Lesen dieser Datei in den Puffercache mit den Werten macht. So erstellen Sie eine 2-GB-Datendatei in 2 Zeilen Bash-Skript unten. Das Skript generiert mit dem Befehl dd eine zufällige 35 MB-Datei und kopiert sie dann 70 Mal in eine neue Datendatei Ausgang:

# dd if=/dev/random of=/root/d1.txt count=1000000
# für i in `Seq 1 70`; echo $i; cat /root/d1.txt >> /root/data_file; getan

Lassen Sie uns die Datei lesen und den Inhalt ignorieren, indem wir die Datei lesen und wie folgt nach /dev/null umleiten:

#KatzeDatendatei> /Entwickler/Null

Ok, was mit diesen Manövern mit unserem Systemspeicher passiert ist, lassen Sie es uns jetzt überprüfen:

#kostenlos -m

Analyse der obigen Ergebnisse. Wir haben immer noch 1,8 GB freien Speicher, sodass der Kernel aufgrund unserer Einstellung min_free_kbytes einen großen Teil des Speichers als reserviert geschützt hat. Der Puffercache hat 1691 MB verwendet, was weniger als die Gesamtgröße unserer Datendatei ist, die 2,3 GB beträgt. Offenbar das ganze Datendatei konnte nicht im Cache gespeichert werden, da kein verfügbarer Speicher für den Puffercache verfügbar ist. Wir können überprüfen, ob die gesamte Datei nicht im Cache gespeichert ist, sondern die wiederholten Versuche, die Datei zu lesen, zeitlich festlegen. Wenn es zwischengespeichert wurde, würde es einen Bruchteil einer Sekunde dauern, um die Datei zu lesen. Lass es uns versuchen.

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

Das Lesen der Datei dauerte fast 20 Sekunden, was bedeutet, dass mit ziemlicher Sicherheit nicht alles zwischengespeichert wurde.

Als letzte Validierung lassen Sie uns die vm.min_free_kbytes reduzieren, damit der Seitencache mehr Platz zum Betrieb hat und wir erwarten können, dass der Cache funktioniert und die Datei viel schneller gelesen wird.

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

Mit dem zusätzlichen Speicher, der für das Caching verfügbar ist, sank die Dateilesezeit von 20 Sekunden zuvor auf 0,364 Sekunden mit allem im Cache.

Ich bin neugierig auf ein weiteres Experiment. Was passiert mit malloc-Aufrufen, um Speicher von einem C-Programm angesichts dieser wirklich hohen vm.min_free_kbytes-Einstellung zuzuweisen? Wird es den malloc versagen? Wird das System sterben? Setzen Sie zuerst die Einstellung vm.min_free_kbytes auf den wirklich hohen Wert zurück, um unsere Experimente fortzusetzen:

#rauswerfen 1500000 > /Prozent/sys/vm/min_free_kbytes

Schauen wir uns noch einmal unseren freien Speicher an:

Theoretisch haben wir 1,9 GB frei und 515 MB zur Verfügung. Lassen Sie uns ein Stresstestprogramm namens stress-ng verwenden, um etwas Speicher zu verbrauchen und zu sehen, wo wir versagen. Wir werden den VM-Tester verwenden und versuchen, 1 GB Speicher zuzuweisen. Da wir nur 1,5 GB auf einem 3,75 GB System reserviert haben, sollte das wohl funktionieren.

# stress-ng --vm 1 --vm-bytes 1G --timeout 60s
Stress: Infos:[17537]Versand von Schweinen:1vm
Stress: Infos:[17537]Cache-Zuweisung: Standard-Cache-Größe: 46080K
Stress: Infos:[17537]erfolgreicher Lauf abgeschlossenin60.09s(1Mindest,0,09trocken)
# 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 versuchen und irgendwann sollte es fehlschlagen. In meinem Test hat es mit 1 und 2 Arbeitern bestanden, aber mit 3 Arbeitern nicht bestanden.

Lassen Sie uns die vm.min_free_kbytes auf eine niedrige Zahl zurücksetzen und sehen, ob uns das hilft, 3 Speicherstressoren mit jeweils 1 GB auf einem 3,75 GB-System auszuführen.

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

Diesmal lief es erfolgreich ohne Fehler, ich habe es zweimal ohne Probleme versucht. Ich kann also schlussfolgern, dass es einen Verhaltensunterschied gibt, mehr Speicher für malloc zur Verfügung zu haben, wenn der Wert vm.min_free_kbytes auf einen niedrigeren Wert gesetzt wird.

Standardeinstellung für vm.min_free_kbytes

Der Standardwert für die Einstellung auf meinem System ist 67584, was etwa 1,8 % des Arbeitsspeichers auf dem System oder 64 MB entspricht. Aus Sicherheitsgründen würde ich auf einem stark ausgelasteten System dazu neigen, es vielleicht etwas auf 128 MB zu erhöhen, um mehr reservierten freien Speicher zu ermöglichen, aber für eine durchschnittliche Nutzung scheint der Standardwert vernünftig genug zu sein. Die offizielle Dokumentation warnt davor, den Wert zu hoch anzusetzen. Die Einstellung auf 5 oder 10 % des System-RAM ist wahrscheinlich nicht die beabsichtigte Verwendung der Einstellung und ist zu hoch.

Einstellen von vm.min_free_kbytes, um Neustarts zu überstehen

Um sicherzustellen, dass die Einstellung Neustarts übersteht und beim Neustart nicht auf die Standardwerte zurückgesetzt wird, stellen Sie sicher, dass die sysctl-Einstellung persistent ist, indem Sie den gewünschten neuen Wert in die Datei /etc/sysctl.conf einfügen.

Abschluss

Wir haben gesehen, dass der Linux-Kernel-Tunable vm.min_free_kbytes modifiziert werden kann und Speicher auf dem System reservieren kann, um sicherzustellen, dass das System insbesondere bei starker Nutzung und starker Speicherzuweisung stabiler ist. Die Standardeinstellungen können insbesondere auf Systemen mit hohem Speicher etwas zu niedrig sein und sollten mit Vorsicht erhöht werden. Wir haben gesehen, dass der von diesem Tunable reservierte Speicher verhindert, dass der OS-Cache den gesamten Speicher verwendet, und verhindert auch, dass einige Malloc-Operationen den gesamten Speicher verwenden.