Performance

Was ist VM.min_free_kbytes und wie man es abstimmt?

Was ist VM.min_free_kbytes und wie man es abstimmt?
Was ist VM.min_free_kbytes sysctl einstellbar für Linux-Kernel und auf welchen Wert sollte es gesetzt werden??  Wir werden diesen Parameter und seine Auswirkungen auf ein laufendes Linux-System in diesem Artikel untersuchen system.  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 zu den idealen Werten für diese Tunable anstellen und zeigen, wie man vm set einstellt.min_free_kbytes dauerhaft, um Neustarts zu überleben.  So lass uns gehen.

Wie vm.min_free_kbytes funktioniert

Das System benötigt möglicherweise Speicherzuweisungen, um das ordnungsgemäße Funktionieren des Systems selbst sicherzustellen.  Wenn der Kernel die Zuweisung des gesamten Speichers zulässt, kann es zu Problemen kommen, wenn er für den regulären Betrieb Speicher benötigt, damit das Betriebssystem reibungslos läuft.  Aus diesem Grund bietet der Kernel die abstimmbare vm.min_free_kbytes.  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 Kilobyte freizuhalten.  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 its. 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 Ihre Maschine sofort OOM.“

VM validieren.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 . erstellt.75 GB RAM.  Verwenden Sie den folgenden kostenlosen Befehl, um das System zu analysieren:

# frei -m

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

Jetzt ändern wir den Wert von vm.min_free_kbytes und sehen Sie, was die Auswirkungen auf den Systemspeicher sind.  Wir geben den neuen Wert an das virtuelle Dateisystem proc zurück, 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 1 . geändert wurde.5 GB ungefähr und ist wirksam.  Jetzt verwenden wir die kostenlos Befehl erneut, um alle vom System erkannten Änderungen anzuzeigen.

# frei -m

Der freie Speicher und der Puffercache bleiben durch den Befehl unverändert, aber die Speichermenge wird als verfügbar wurde von 3327 auf 1222 MB reduziert.  Dies ist eine ungefähre Reduzierung der Änderung des Parameters auf 1.5 GB freier Speicherplatz.

Lassen Sie uns nun eine 2 GB große 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 Ausgabe:

# dd if=/dev/zufällig von=/root/d1.txt-Anzahl=1000000
# für i in 'Seq 1 70'; echo $i; Katze /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:

# cat data_file > /dev/null

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

# frei -m

Analyse der obigen Ergebnisse.  Wir haben noch 1.8 GB freier Speicher, sodass der Kernel aufgrund unserer min_free_kbytes-Einstellung 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 Zoll beträgt.3 GB.  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 bestätigen, dass nicht die gesamte Datei im Cache gespeichert ist, sondern die wiederholten Versuche, die Datei zu lesen, zeitlich planen. Wenn es zwischengespeichert wäre, 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 sie mit ziemlicher Sicherheit nicht alle zwischengespeichert sind.

Als letzte Validierung reduzieren wir die vm.min_free_kbytes, damit der Seitencache mehr Platz zum Betrieb hat und wir erwarten können, dass der Cache funktioniert und das Lesen der Datei viel schneller 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 zur Verfügung steht, wurde die Dateilesezeit von 20 Sekunden vor auf .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 zuzuweisen?.min_free_kbytes-Einstellung.  Wird es dem malloc fehlschlagen??  Wird das System sterben??  Setzen Sie zuerst die VM zurück.min_free_kbytes auf den wirklich hohen Wert setzen, um unsere Experimente fortzusetzen:

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

Schauen wir uns noch einmal unseren freien Speicher an:

Theoretisch haben wir 1.9 GB frei und 515 MB verfügbar.  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 reserviert haben.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] Abfertigung von Schweinen: 1 VM
stress-ng: info:  [17537] Cache-Zuweisung: Standard-Cache-Größe: 46080K
stress-ng: info:  [17537] erfolgreicher Lauf in 60 . abgeschlossen.09s (1 min, 0.09 Sek.)
# 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 scheitern.  In meinem Test hat es mit 1 und 2 Arbeitern bestanden, aber mit 3 Arbeitern nicht bestanden.

Lass uns die VM zurücksetzen.min_free_kbytes auf eine niedrige Zahl und sehen Sie, ob uns das hilft, 3 Speicherstressoren mit jeweils 1 GB auf einem 3 . laufen zu lassen.75-GB-System.

# 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 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 auf meinem System ist 67584, was etwa 1 entspricht.8% RAM auf dem System oder 64 MB. 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 die durchschnittliche Nutzung scheint der Standardwert vernünftig genug zu sein.  Die offizielle Dokumentation warnt davor, den Wert zu hoch zu machen.  Die Einstellung 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 ü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 /etc/sysctl . eingeben.conf-Datei.

Fazit

Wir haben gesehen, dass die vm.min_free_kbytes Linux-Kernel Tunable kann modifiziert werden und kann Speicher auf dem System reservieren, um sicherzustellen, dass das System stabiler ist, insbesondere bei starker Nutzung und hoher Speicherzuweisung memory.  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.

Installieren Sie das neueste OpenRA-Strategiespiel auf Ubuntu Linux
OpenRA ist eine Libre/Free Real Time Strategy Game Engine, die die frühen Westwood-Spiele wie den Klassiker Command & Conquer: Red Alert Red nachbilde...
Installieren Sie den neuesten Dolphin Emulator für Gamecube & Wii unter Linux
Mit dem Dolphin Emulator können Sie Ihre ausgewählten Gamecube- und Wii-Spiele auf Linux-Personalcomputern (PC) spielen. Als frei verfügbarer Open-So...
So verwenden Sie die GameConqueror-Cheat-Engine unter Linux
Der Artikel enthält eine Anleitung zur Verwendung der GameConqueror-Cheat-Engine unter Linux. Viele Benutzer, die Spiele unter Windows spielen, verwen...