Warum meldet Linux seltsamerweise "freien" Speicher?

44

Dies ist eine kanonische Frage dazu, wie Unix-Betriebssysteme die Speichernutzung melden.
Ähnliche Fragen:

Ich habe einen Produktionsserver, auf dem Debian 6.0.6 Squeeze läuft

#uname -a

Linux debsrv 2.6.32-5-xen-amd64 #1 SMP Sun Sep 23 13:49:30 UTC 2012 x86_64 GNU/Linux

Jeden Tag führt cron ein Backup-Skript als root aus:

#crontab -e

0 5 * * * /root/sites_backup.sh > /dev/null 2>&1

#nano /root/sites_backup.sh

#!/bin/bash
str=`date +%Y-%m-%d-%H-%M-%S`
tar pzcf /home/backups/sites/mysite-$str.tar.gz /var/sites/mysite/public_html/www
mysqldump -u mysite -pmypass mysite | gzip -9 > /home/backups/sites/mysite-$str.sql.gz
cd /home/backups/sites/
sha512sum mysite-$str* > /home/backups/sites/mysite-$str.tar.gz.DIGESTS
cd ~

Alles funktioniert einwandfrei, aber ich stelle fest, dass Munins Speichergraph eine Erhöhung des Cache und der Puffer nach dem Backup anzeigt .

Dann lade ich einfach Sicherungsdateien herunter und lösche sie. Nach dem Löschen bringt Munins Speichergraph den Cache und die Puffer in den Zustand vor dem Backup zurück.

Hier ist Munin Graph:

Das extern gehostete Bild war ein toter Link.

Gemeinschaft
quelle
3
Glückwunsch, diese Frage wurde kanonisiert (es ist wie die sechste, die heute danach fragt, und es hat zufällig das interessanteste und schönste Beispiel :-)
voretaq7 16.11.12
6
Siehe LinuxAteMyRam.com
Christoffer Hammarström

Antworten:

27

Dies ist das gleiche "Problem", da der Server die Verwendung der Swap-Partition und einiger anderer ähnlicher Fragen auf dieser Site ablehnt . ( Hohe Speichernutzung auf Linux Server , Speichernutzung in LINUX , Web Server Ausführen von Low Speichern , etc.)

Achten Sie darauf, dass der Speicherverbrauch aus dem Cache stammt . Dies bedeutet, dass eine Datei im Speicher bleibt. Der zwischengespeicherte Speicher ist "freier" Speicher. Anstatt den Speicherblock leer zu lassen, speichert Ihr Betriebssystem die zuletzt gelesenen Dateien in diesem Bereich. Wenn eine Anwendung diesen Speicher benötigt, wird er von der Anwendung verwendet. Bis dahin haben Sie die Möglichkeit, zu vermeiden, dass Sie eine Datei erneut von der Festplatte lesen müssen, wenn häufig darauf verwiesen wird.

Gemäß diesem Diagramm hat sich Ihr effektiver Speicherverbrauch während der gesamten Dauer des Diagramms überhaupt nicht geändert.

Jeff Ferland
quelle
Kann der Server angewiesen werden, diese Dateien nicht zwischenzuspeichern? Ich denke, ich sollte sync; echo 3 > /proc/sys/vm/drop_cachesnach dem Backup ausgeführt werden?
13
@ stan31337 Ja, es ist möglich, nein das solltest du nicht tun. Das Speichern dieser Datei kostet Sie nichts. Wenn Sie alle Ihre Caches löschen, verlangsamt jede zwischengespeicherte Datei, die erneut von der Festplatte gelesen werden muss, nur Ihr System. Lassen Sie es tun, wofür es entwickelt wurde.
Jeff Ferland
2
@ stan31337 Wenn Sie Ihre Sicherungsdatei löschen, wird sie vom Betriebssystem automatisch aus dem Cache entfernt (aus diesem Grund springt der freie Speicher nach dem Löschen erneut). Linux ist schlau genug, um zu wissen, dass eine Datei nicht geöffnet ist und nicht geöffnet werden kann erreichbar aus dem Dateisystembaum wird nie wieder zugegriffen. Wie Jeff bereits sagte, möchten Sie auf keinen Fall Ihren gesamten FS-Cache sichern (das System muss nur die Daten von der Festplatte neu lesen und zwischenspeichern, wodurch Ihr Server für eine Weile langsamer wird)
voretaq7
61

Sie haben das Problem mit Linux Ate My Ram .

Keine Panik.

Das ist kein Problem.

Ihr System arbeitet wie vorgesehen.

Das Problem ist nicht Ihr Betriebssystem - das Problem ist, dass Sie verstehen, was "freier" Speicher ist.


Unix-Systeme verwenden Speicher nicht nur zum Ausführen von Programmen. Speicher kann verwendet werden für:

  • Laufende Programme (aktiv / verwendet)
  • Zwischenspeichern von Daten während der Übertragung (Puffer)
  • Zwischenspeichern von kürzlich von der Festplatte gelesenen / auf die Festplatte geschriebenen Daten (Cache)
  • Absolut nichts (kostenlos)

Es folgt eine kurze (und weitgehend unvollständige) Übersicht darüber, wie moderne Unix-Systeme die RAM-Auslastung melden.

Was ist freier Speicher (die Betriebssystemdefinition) ?

Wenn ein Unix-System RAM als frei meldet , bedeutet dies "Ich benutze diesen RAM für nichts".
Freier RAM ist praktisch wertlos - Es beschleunigt Ihr System nicht, es sitzt nur da und ist "frei", falls etwas benötigt wird. Das könnte eines der drei anderen Dinge sein, die ich oben erwähnt habe.

Was sind Cache- und Pufferspeicher?

Cache und Pufferspeicher sind RAM, die das Betriebssystem verwendet, um Ihr System schneller zu machen.
Dieser Speicher wird derzeit nicht zum Ausführen von Programmen benötigt , daher verwendet Ihr Betriebssystem ihn, um häufig benötigte Daten zu speichern. Beispielsweise wird die C-Bibliothek (die von so gut wie jedem ausgeführten Programm benötigt wird) fast immer im cacheSpeicher gespeichert Das System muss nicht zur Festplatte gehen, um die Anweisungen zum Drucken von "Hello World" auf dem Bildschirm zu finden.
Eigentlich ist es viel komplizierter - es gibt Shared Memory, Wired Memory usw. - aber für unsere Zwecke ist diese einfache Erklärung ausreichend.

Was ist aktiver Speicher?

Aktiver Speicher ist Teil von "verwendetem" Speicher - RAM, das von Anwendungen verwendet wird - Sortieren von Arbeitsblättern, Bereitstellen von Webseiten, Bearbeiten von Grafiken usw.
Aktiver Speicher war in letzter Zeit "aktiv". - das Programm behauptet, es habe seinen Inhalt verwendet (Lesen oder Schreiben), und es wird nicht als guter Kandidat für das Auswechseln angesehen.

Was ist inaktiver Speicher?

Wie der aktive Speicher ist der inaktive Speicher der Arbeitsspeicher, den die Anwendungen für ihre Zwecke verwenden. Der Unterschied besteht darin, dass auf diesen Speicher seit einiger Zeit nicht mehr zugegriffen wurde. Wenn also Push kommt, denkt das Betriebssystem, dass er auf die Festplatte ausgelagert werden kann, und (mit etwas Glück) das Programm, das behauptet, dass es nicht mehr danach fragt werde es nie bemerken.

Was ist "Verwendeter" Speicher (die MENSCHLICHE Definition)

Was Sie und ich als "belegten" Speicher betrachten, ist im Wesentlichen die Summe aus aktivem und inaktivem Speicher. Der gesamte RAM, der derzeit von Anwendungen für ihre Verwendung beansprucht wird.
Solange Sie mehr Arbeitsspeicher installiert haben als die Summe aus aktivem und inaktivem Arbeitsspeicher (plus einem Sicherheitsspielraum von 512-1024 MB), sind Sie in Ordnung: Ihr Betriebssystem wird wahrscheinlich die Swap- und Kill-Leistung nicht beeinträchtigen .

Was ist "freier" Speicher (die MENSCHLICHE Definition) ?

Was Sie und ich als "freien" Speicher betrachten, ist der Speicher, der zum Ausführen von Programmen zur Verfügung steht.
Dies ist etwas komplizierter als nur die Zahl "Kostenlos", die Ihr Betriebssystem ausgibt. Wenn ein Programm nach RAM fragt, versucht das Betriebssystem, den RAM so störungsfrei wie möglich abzurufen:

  • Wenn freier Speicherplatz zur Verfügung steht (der herumsteht und nichts tut), wird dieser RAM zugewiesen.
  • Wenn kein freier Speicher verfügbar ist, kann das Betriebssystem den Cache- und Pufferbereich ausschlachten: Das Material, auf das zuletzt / am seltensten zugegriffen wurde, im Pufferpool wird verworfen und der Arbeitsspeicher an das Programm übergeben.
  • Wenn es keinen Buffer / Cache-RAM zum Ausschlachten gibt, prüft der Swapper den inaktiven Speicher und wählt die Regionen aus, auf die er am wenigsten zugreifen kann. Diese Daten werden ausgelagert, um sie auszutauschen (Festplatte), und der neu freigegebene RAM wird an das Programm übergeben.
  • Wenn der gesamte inaktive Arbeitsspeicher ausgelagert wurde, beginnt der Swapper, den aktiven Arbeitsspeicher auf die Festplatte zu stellen.
    (Dies ist ungefähr der Punkt, an dem die Leistung normalerweise den Hunden zukommt: Jedes Mal, wenn ein Programm die CPU einschaltet, müssen die ausgelagerten Bits in den RAM zurückgebracht werden, was bedeutet , dass der aktive Speicher eines anderen Programms ausgelagert werden muss - der hoher Swap-Umsatz wird als Thrashing bezeichnet )
  • Wenn das System alles ausgelagert hat (und die Swap-Partition gefüllt hat) oder wenn Sie ein System ohne Swap-Partition betreiben , passieren schlimme Dinge . Zu diesem Zeitpunkt wird eines von zwei Dingen eintreten:
    • malloc()wird versagen. Dies ist das POSIX-konforme Verhalten. Das Betriebssystem teilt dem nach RAM fragenden Programm mit, dass die Anforderung nicht erfüllt werden kann.
      Das Programm kann entweder nach weniger RAM fragen oder wenn es mit einem kleineren Speicherblock nicht auskommt, kann es aufräumen und beenden. (Wenn das Programm schlecht geschrieben ist, stürzt es einfach ab.)
    • Wenn Sie auf einer Linux-Box arbeiten, kann es sein , dass der OOM-Killer einen Drive-by-Mord begeht und andere Prozesse beendet, um genügend RAM freizugeben , um die Anforderung zu erfüllen.
      Falls Sie anhand meiner Beschreibung hier und meiner Antwort auf die verknüpfte Frage nicht sagen können, halte ich dies für einen schrecklichen Weg, um das Problem zu lösen.

Warum steigt der freie Arbeitsspeicher beim Löschen von Dateien an?

In dem Beispiel aus der Frage hier haben Sie bemerkt, dass es möglich ist, RAM durch Löschen der Sicherungsdatei "freizugeben" - die Erklärung dafür ist ziemlich einfach: Da diese Datei von niemandem verwendet wird (keine offenen Datei-Handles) und von wo aus nicht mehr zugegriffen werden kann das Dateisystem (nicht verbunden) Das Betriebssystem weiß, dass niemand jemals wieder auf diese Daten zugreifen wird, und löscht die Daten aus dem Dateisystem-Cache.
Dadurch meldet das Betriebssystem mehr freien Speicher, hat jedoch keine Auswirkungen auf die Systemleistung.

voretaq7
quelle
Jetzt ist es für mich vollkommen klar ... Meine Linux-Erfahrung beträgt etwas 2 Monate, alles begann mit diesem Debian-Server. Vor einem Monat habe ich Gentoo auf meinem Heim-Laptop installiert und war so erstaunt über die Leistung, dass es sogar auf meinem Arbeitscomputer von einem Windows-Benutzer zu einem Linux-Benutzer wurde. Es ist großartig, Linux mit Gentoo zu lernen, und trotzdem gibt es verdammt viel zu lernen.
@ stan31337 Du bist nicht der Einzige, für den es unklar ist - es ist besonders schwierig für Leute, die aus einem Windows-Hintergrund stammen, da Windows die Speichernutzung nicht mit dieser Detailstufe meldet - es ist nur "Verwendet" (von Programmen) ) und "Free" (für Programme zum Mitnehmen). Mac-Benutzer haben es etwas einfacher, da Activity Monitor im Grunde eine grafische Version von topFree / Wired / Active / Inactive RAM ist und dies meldet.
Voretaq7
Früher habe ich mit Process Explorer unter Windows gearbeitet, es gab eine Menge Speicher-Dinge zu zeigen, aber die meisten waren mir so unklar, dass ich sie tatsächlich nicht
2
Außerdem sollte beachtet werden , , dass , während Windows in der Regel nicht zeigen , es in so viel Detail, eine hat sehr ähnliches Setup.
Joachim Sauer
Sie wissen, auch unter Windows ist das Auslesen des Speichers verwirrend. Dies ist etwas, auf das OS-Hersteller mehr Wert legen möchten, oder etwas, das die Benutzer weniger interessieren sollten als derzeit.
Eltern
2

Noch etwas, um zu überprüfen, ob die oben genannten Probleme auftreten:

Überprüfen Sie die Nutzung des Slab - Cache ( Slab:, SReclaimable:und SUnreclaim:in /proc/meminfo). Hierbei handelt es sich um einen Cache mit kerninternen Datenstrukturen, der von dem Seiten-Cache getrennt ist, den von gemeldet wird free.

Wenn der Plattencache für einen großen Teil Ihres "fehlenden Speichers" verantwortlich ist, überprüfen Sie /proc/slabinfo, wo er sich befindet. Wenn es sich um Einträge oder Inodes handelt, können Sie diese entfernen sync ; echo 2 > /proc/sys/vm/drop_caches.

Sie können das slabtopTool auch verwenden , um die aktuelle Verwendung des Slab-Caches in einem benutzerfreundlichen Format anzuzeigen. csortiert die Liste nach der aktuellen Cachegröße.

Von: https://stackoverflow.com/a/5467207

Chris S
quelle