Warum verbraucht mein System nach einer Stunde mehr RAM?

7

Ich verwende Arch Linux (5.1.8-arch1-1-ARCH) mit XFCE DE und XFWM4 WM. Die Dinge sind ziemlich elegant und wenig RAM und CPU-Auslastung.

Nach dem Booten und wenn das DE vollständig geladen ist, sehe ich 665 MiB RAM-Auslastung.

Nach dem Öffnen von Anwendungen wie Atom, Code, Firefox, Chromium oder nach der Arbeit mit GIMP, Blender usw. steigt jedoch die RAM-Auslastung, was offensichtlich ist. Aber nachdem ich alle Anwendungen geschlossen und nur einen Gnome-System-Monitor übrig gelassen habe, kann ich sehen, dass die RAM-Auslastung 1,2 - 1,4 GiB beträgt. / proc / meminfo stimmt mit gnome-system-monitor überein, aber htop liefert ständig unterschiedliche Ergebnisse.

Das Schlimmste ist, dass wenn ich später eine RAM-Hogging-Anwendung öffne, diese zusätzlich zu den 1,4 GiB wieder den benötigten Speicher verbraucht. Dies ist immer der Fall. Im Verzeichnis / tmp / werden keine Dateien gespeichert, die sich auf Megabyte summieren könnten.

Wenn ich nach dem Prozess suche, der so viel RAM verbraucht (von 700 MiB zu Beginn bis 1,4 GiB nach dem Schließen des Browsers !!), sehe ich nichts. Tatsächlich hatte ich sogar auf meinem Himbeer-Pi mit Arch ARM das gleiche Problem.

Hier ist ein Screenshot 1 Hier ist ein Screenshot 2

Der Ruby-Code:

#!/usr/bin/ruby -w
STDOUT.sync = true

loop do
    IO.readlines(File.join(%w(/ proc meminfo))).then { |x| [x[0], x[2]] }.map { |x| x.split[1].to_i }.reduce(:-)
        .tap { |x| print "\e[2K\rRAM Usage:".ljust(20), "#{x / 1024.0} MiB".ljust(24), "#{(x / 1000.0)} MB" }
    Kernel.sleep(0.1)
end

Der cat /proc/meminfoBefehl hat folgende Ausgabe:

MemTotal:        3851796 kB
MemFree:         1135680 kB
MemAvailable:    2055708 kB
Buffers:            1048 kB
Cached:          1463960 kB
SwapCached:          284 kB
Active:          1622148 kB
Inactive:         660952 kB
Active(anon):     923580 kB
Inactive(anon):   269360 kB
Active(file):     698568 kB
Inactive(file):   391592 kB
Unevictable:      107012 kB
Mlocked:              32 kB
SwapTotal:       3978216 kB
SwapFree:        3966696 kB
Dirty:               280 kB
Writeback:             0 kB
AnonPages:        924844 kB
Mapped:           563732 kB
Shmem:            374848 kB
KReclaimable:      74972 kB
Slab:             130016 kB
SReclaimable:      74972 kB
SUnreclaim:        55044 kB
KernelStack:        8000 kB
PageTables:        14700 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     5904112 kB
Committed_AS:    3320548 kB
VmallocTotal:   34359738367 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
Percpu:             1456 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:               0 kB
DirectMap4k:      226736 kB
DirectMap2M:     3778560 kB
DirectMap1G:           0 kB

Erstens haben Sie bemerkt, dass htop niemals zustimmt. Ich weiß nicht viel darüber.

Und zweitens können Sie sehen, dass das xfdesktop 44 MiB verwendet und einige andere Prozesse einen Teil des Speichers verwenden, der Kernel ~ 150 MiB und abgesehen davon, warum 1,5 GB RAM verwendet werden? Beeinträchtigt dies wirklich die Leistung des Systems?

S. Goswami
quelle
8
Haben Sie diesbezüglich ein aktuelles Problem? Ich gehe davon aus, dass der Speicher für das Caching und verschiedene Puffer verwendet wird und verfügbar wäre, wenn eine Anwendung ihn tatsächlich benötigt.
Kusalananda
4
Haben Sie wieder ein tatsächliches Problem? Laufen Anwendungen nicht richtig? Was Sie beschreiben, erscheint mir normal.
Kusalananda
3
Ich sehe hier kein Problem. Es ist ziemlich üblich, dass der Linux-Kernel so viel Speicher wie möglich verbraucht, um so schnell wie möglich zu sein, was für mich absolut sinnvoll ist. Die Verwendung von freiem Speicher als "Cache" oder "Puffer" bedeutet nicht, dass dieser Speicher nicht für Anwendungen verfügbar ist, wenn diese von diesen Apps angefordert werden. Es heißt nur, dass der Kernel es "benutzt" und aus "welchem ​​Grund", was der Kernel bei Bedarf ändern kann. Ich empfehle Ihnen, zu diesem Thema viel über die Speicherverwaltung des Linux-Kernels, die dort verwendeten Speichertypen, die dort verwendete Terminologie usw. zu lesen. Ich bin mir sicher, dass dies die Dinge für Sie klären wird.
Axel Werner
7
"Es macht eigentlich nichts anderes als RAM zu verschwenden." -> Leerlauf-RAM ist RAM-Verschwendung. Wenn RAM verwendet wird, wird es nicht verschwendet.
Muru
3
Fragen wie diese sind selbst auf dieser Seite ziemlich häufig. siehe hier für einen Anfang: unix.stackexchange.com/questions/265671/…
Axel Werner

Antworten:

19

Nicht verwendeter RAM ist verschwendeter RAM. Der Linux-Kernel verfügt über erweiterte Speicherverwaltungsfunktionen und versucht, den Engpass in Ihrem System, Ihrer Festplatte / SSD, nicht zu belasten. Es wird versucht, Dateien im Speicher zwischenzuspeichern.

Das Speicherverwaltungssystem arbeitet auf komplexe Weise, eine bessere Leistung ist das Ziel.

Sie können sehen, was es tut, indem Sie inspizieren /proc/meminfo.

cat /proc/meminfo

Sie können diesen zwischengespeicherten Speicher mit "drop_caches" zurückfordern. Beachten Sie jedoch in der Dokumentation, dass "die Verwendung außerhalb einer Test- oder Debugging-Umgebung nicht empfohlen wird", einfach weil "das erneute Erstellen der abgelegten Objekte eine erhebliche Menge an E / A und CPU kosten kann", wenn sie erneut benötigt werden :-).

Nur PageCache löschen:

# sync; echo 1 > /proc/sys/vm/drop_caches

Löschen Sie Einträge und Inodes:

# sync; echo 2 > /proc/sys/vm/drop_caches

PageCache, Einträge und Inodes löschen:

# sync; echo 3 > /proc/sys/vm/drop_caches

Beachten Sie, dass dadurch syncder Dateisystempuffer geleert wird, um sicherzustellen, dass alle Daten geschrieben wurden.

Aus den Kernel-Dokumenten :

Seiten-Cache

Der physische Speicher ist flüchtig und der übliche Fall, um Daten in den Speicher zu bringen, besteht darin, sie aus Dateien zu lesen. Immer wenn eine Datei gelesen wird, werden die Daten in den Seitencache gestellt, um einen teuren Festplattenzugriff bei den nachfolgenden Lesevorgängen zu vermeiden. In ähnlicher Weise werden die Daten beim Schreiben in eine Datei in den Seitencache gestellt und gelangen schließlich in das Sicherungsspeichergerät. Die geschriebenen Seiten werden als fehlerhaft markiert. Wenn Linux beschließt, sie für andere Zwecke wiederzuverwenden, wird sichergestellt, dass der Dateiinhalt auf dem Gerät mit den aktualisierten Daten synchronisiert wird.

Zurückfordern

Während der gesamten Systemlebensdauer kann eine physische Seite zum Speichern verschiedener Datentypen verwendet werden. Dies können kernelinterne Datenstrukturen, DMA-fähige Puffer für Gerätetreiber, aus einem Dateisystem gelesene Daten, durch Benutzerbereichsprozesse zugewiesenen Speicher usw. sein.

Abhängig von der Seitennutzung wird es von der Linux-Speicherverwaltung unterschiedlich behandelt. Die Seiten, die jederzeit freigegeben werden können, entweder weil sie die an anderer Stelle verfügbaren Daten zwischenspeichern, beispielsweise auf einer Festplatte, oder weil sie wieder auf die Festplatte ausgelagert werden können, werden als "zurückgefordert" bezeichnet. Die bemerkenswertesten Kategorien der zurückforderbaren Seiten sind der Seitencache und der anonyme Speicher.

In den meisten Fällen können die Seiten, die interne Kerneldaten enthalten und als DMA-Puffer verwendet werden, nicht erneut verwendet werden, und sie bleiben fixiert, bis sie von ihrem Benutzer freigegeben werden. Solche Seiten werden als nicht zurückfordernd bezeichnet. Unter bestimmten Umständen können jedoch auch Seiten mit Kernel-Datenstrukturen zurückgefordert werden. Beispielsweise können speicherinterne Caches von Dateisystem-Metadaten erneut vom Speichergerät gelesen werden, und daher ist es möglich, sie aus dem Hauptspeicher zu verwerfen, wenn das System unter Speicherdruck steht.

Der Vorgang des Freigebens und Wiederverwendens der wiederherstellbaren physischen Speicherseiten wird als (Überraschung!) Zurückfordern bezeichnet. Linux kann Seiten je nach Systemstatus entweder asynchron oder synchron zurückfordern. Wenn das System nicht geladen ist, ist der größte Teil des Speichers frei und Zuordnungsanforderungen werden sofort von der Bereitstellung der freien Seiten erfüllt. Mit zunehmender Auslastung nimmt die Anzahl der freien Seiten ab, und wenn ein bestimmter Schwellenwert (hohes Wasserzeichen) erreicht wird, wird der kswapd-Dämon durch eine Zuweisungsanforderung aktiviert. Es scannt asynchron Speicherseiten und gibt sie entweder nur frei, wenn die darin enthaltenen Daten an anderer Stelle verfügbar sind, oder entfernt sie auf dem Sicherungsspeichergerät (erinnern Sie sich an diese schmutzigen Seiten?). Wenn die Speichernutzung noch weiter zunimmt und einen anderen Schwellenwert erreicht - das Mindestwasserzeichen -, löst eine Zuweisung eine direkte Rückforderung aus. In diesem Fall wird die Zuordnung angehalten, bis genügend Speicherseiten zurückgefordert wurden, um die Anforderung zu erfüllen.

Speicherlecks

Einige Programme können nun "Speicherlecks" aufweisen, dh sie "vergessen", Speicher freizugeben, den sie nicht mehr verwenden. Sie können dies sehen, wenn Sie ein Programm einige Zeit laufen lassen, seine Speichernutzung ständig zunimmt. Wenn Sie es schließen, wird der Speicher nie freigegeben. Jetzt versuchen Programmierer natürlich, Speicherlecks zu vermeiden, aber Programme können einige haben. Die Möglichkeit, diesen Speicher zurückzugewinnen, ist ein Neustart.

thecarpy
quelle
5
Der Linux-Kernel ist extrem faul mit Verwaltungsvorgängen. Wenn ich 1 GB RAM auf einem neu gestarteten System reserviere, kann ich sehen, dass ich jetzt 1 GB weniger freien Speicher habe. Wenn ich den Speicher danach freigebe, habe ich ihn freigegeben, aber die Menge an freiem Speicher erhöht sich nicht um 1 GB, da der Kernel nur dann nach verfügbarem Speicher sucht, wenn ihm nicht genügend Speicherplatz zur Verfügung steht. Machen die obigen Befehle den Kernel auch darauf aufmerksam, dass ich 1 GB freigegeben habe, und erhöhen folglich die (angezeigte) Menge an freiem Speicher?
Bananguin
3
Diese sehr gute Frage kann nicht in einem Kommentar beantwortet werden. Bitte stellen Sie die Frage auf dieser Site und ich oder jemand, der besser informiert ist als ich, es gibt viele auf dieser Site, wird sie beantworten. Fügen Sie in Ihre Frage die Ausgabe von cat /proc/meminfoAfter Boot ein und dann noch einmal, nachdem Sie "den Speicher freigegeben / freigegeben" haben. Erwähnen Sie auch, welche Befehle Sie verwendet haben, um "Speicher freizugeben".
Thecarpy
@ Bananguin Können Sie ein zuverlässiges Rezept geben, um das zu reproduzieren? Weil es für mich offensichtlich falsch klingt.
marcelm
5
@thecarpy "Wenn Sie es schließen, wird der Speicher nie freigegeben." Das klingt nicht richtig. Der Kernel sollte verfolgen, welcher Speicher welchen Prozessen zugewiesen ist, sodass es trivial ist, diesen Speicher beim Beenden eines Prozesses zurückzugewinnen, unabhängig davon, ob der Prozess jemals aufgerufen wurde freeoder gleichwertig ist.
8bittree
Es gibt anscheinend gute Gründe, die RAM-Kapazität Ihres Computers (innerhalb eines angemessenen Rahmens) zu maximieren. Wenn Sie also der Meinung sind, dass Sie mit 16 GB RAM gut zurechtkommen, stellen Sie sich vor, wie viele weitere Dateien zwischengespeichert werden könnten (oder andere Optimierungen vorgenommen werden könnten), wenn Sie 32 GB hätten.
Roy Tinker
2

Sie haben sich eine Liste der Prozesse und deren Speichernutzung angesehen. Aber es gab ein Problem. Sie haben nicht die vollständige Liste angesehen.

gnome-system-monitorzeigt standardmäßig nur "Meine Prozesse" an. rootKlicken Sie auf das Menüsymbol oben rechts (drei Punkte in einer vertikalen Linie), um Prozesse anzuzeigen, die allen Systembenutzern gehören, einschließlich des Benutzers. Ändern Sie die Auswahl von "Meine Prozesse" in "Alle Prozesse".


  1. Wird im Vergleich zum verfügbaren System-RAM als einzelne Nummer verwendet
  2. Analysieren / proc / meminfo
  3. Andere Tools, die Sie verwenden könnten - atopheute installieren 8-)

1. Wird im Vergleich zum verfügbaren System-RAM als einzelne Nummer verwendet

Ich sehe deine Ruby - Code Subtraktionen MemAvailableaus MemTotal. Dies ist genau die gleiche Berechnung, die von verwendet wird gnome-system-monitor, wenn das System "1,5 GiB (41,4%) von 3,7 GiB" verwendet.

Sie haben das Recht, entweder gnome-system-monitoroder Ihre manuelle Berechnung zu verwenden, zumindest als erste Annäherung. Die MemAvailableNummer enthält im Grunde den gesamten zurückforderbaren "Cache". Dh MemAvailableenthält eine Art "Cache", der "verfügbar" ist, um zurückgefordert zu werden, sobald ein Programm mehr Speicher benötigt, als Sie frei haben.

Randnotiz: Es gibt einen anderen Typ oder eine andere Bedeutung von "Cache", die nicht zurückgefordert werden kann . Wenn Sie sich die Cache/ "Cache" -Nummer ansehen , wird normalerweise gemeldet, dass sie Shmem/ "shared" enthält. Der ShmemTeil ist kein Cache. Die Verwirrung tritt auf, weil Shmemsie mit dem "Seiten-Cache" des Kernels geschickt implementiert wurde.

Eine andere Möglichkeit, schnell "verfügbar" zu überprüfen, ist free -h.

Der freeBefehl zeigt auch "freigegeben", Swap-Verwendung usw. an. In Ihrer Systemdokumentation sollten die Ausgabefelder und verfügbaren Optionen aufgeführt sein, z man free. Einige der anderen Felder können irreführend sein:

  • Das Feld "verwendet" im freeBefehl enthält (derzeit) nicht "freigegeben". Dies kann sehr verwirrend sein. Ignorieren Sie das Feld "verwendet" .
  • Der von angezeigte "zwischengespeicherte" Wert freeleidet unter dem oben angegebenen Problem.
  • Wenn freenicht "verfügbar" angezeigt wird, ist Ihr System uralt. Konsultieren Sie Ihre alte Dokumentation.

2. Analysieren von / proc / meminfo

Vielen Dank für die volle Ausgabe von cat /proc/meminfo. Dies hilft oft dabei, bestimmte Antworten (oder überhaupt eine Antwort) zu finden. Wenn Sie sehen möchten, wie MemAvailabledie Berechnung selbst durchgeführt wird, können Sie den ersten Abschnitt meiner Antwort hier lesen: Ist der "zwischengespeicherte" Speicher de facto frei?

AnonPages

In Ihrem Beispiel meminfohaben Sie AnonPages: 924844 kB(0,9 GB). AnonPagesist einer der Begriffe, die reduziert MemAvailable.

Wenn dies AnonPageszunimmt, sollte dies auf eine Zunahme von "RES" oder "RSS" ("Resident" in RAM "Set Size") einiger laufender Programme hinweisen. RSS kann jedoch irreführend sein, da ein Teil des Speichers gemeinsam genutzt wird:

Sie können RSS nicht addieren, da dies den gemeinsam genutzten Speicher doppelt zählen würde. Sie müssen PSS , das proportionale RSS, nach Berücksichtigung der Freigabe addieren . Der smemBefehl kann PSS anzeigen und auch Summen berechnen. Zum Beispiel:

  • sudo smem -t > p; head -n1 p; echo; tail -n17 p- Sehen Sie sich die Speichernutzung pro Prozess an. Der tailTeil zeigt die Top 15 Prozesse, gefolgt von einer Zeile mit der gesamten PSS usw.
  • smem -t -U ^sourcejedi$ > U; head -n1 U; echo; tail -n17 U - Sehen Sie sich die Speichernutzung von Prozessen an, die meinem Benutzer "sourcejedi" gehören.
  • sudo smem -t -u- Sehen Sie sich den nach Benutzer gruppierten Speicher an. Dies kann nützlich sein, um Ihre Anmeldesitzungen von einigen Systemdämonen zu unterscheiden, die als eigene Benutzer ausgeführt werden. Beispielsweise wird packagekitd als rootBenutzer ausgeführt und kann Hunderte von Megabyte verwenden.
  • smem -t -P firefox - Sehen Sie sich die Speichernutzung meines Webbrowsers an :-).
  • sudo smem -t -m > m; head -n5 m; echo; tail m- Sehen Sie sich den Speicher an, der nach dem Zuordnungsnamen gruppiert ist - dem Namen der zwischengespeicherten Datei oder "<anonym>" oder "[Heap]" .

    Der "residente" Prozessspeicher enthält sowohl "anonymen" Speicher als auch einige zwischengespeicherte Dateien. smem -mEs können nicht alle zwischengespeicherten Dateien angezeigt werden, sondern nur bestimmte Dateitypen, die derzeit verwendet werden. Insbesondere Dateien, die ein Programm dem virtuellen Speicher zugeordnet hat. Dies umfasst Programmcode, Bibliothekscode und Dateien, die mit mmap () zugeordnet wurden.

Shmem

Sie haben auch Shmem: 374848 kB(0,4 GB). Ich habe oben erwähnt Shmem/ "geteilt". Dies ist ein weiterer Begriff, der den "verfügbaren" Speicher reduziert. (Es ist kein Cache zurückgefordert). Das ist ziemlich normal, aber Sie könnten versuchen zu sehen, was es ist.

Ein Teil des gemeinsam genutzten Speichers ist als Speicher einzelner Prozesse sichtbar. Wenn der gemeinsam genutzte Speicher von einem Prozess zugeordnet wird, sollte er im RSS / PSS gezählt werden. Siehe oben. Der "Zuordnungsname" kann hier manchmal nützlich sein (z smem -t -m. B. ).

ShmemEnthält Dateien auf gemountet tmpfs. Sie können alle gemounteten tmpfsmit überprüfen df -t tmpfs.

Abhängig von Ihrem System Shmemkönnen einige Grafikpuffer enthalten sein. Ich habe eine Möglichkeit gefunden, die aktuelle Größe auf meinem System zu überprüfen (Intel-Grafik): Kann ich die Speichermenge anzeigen, die als GEM-Puffer zugewiesen ist? Ich würde gerne wissen, ob Sie einen anderen Weg finden, um Ihr System zu überprüfen!

Ich habe gelesen, dass ShmemSpeicherverluste in einigen anderen Grafiktreibern mit sehr großen VIRT (auch bekannt als VSIZE) für Xorg verbunden sein können. Linux verwendet den gesamten Swap und reagiert nicht mehr, solange genügend freier Arbeitsspeicher vorhanden ist

Andere Speichernutzung?

  • MemTotal - MemAvailable = 1796088 kB (1,8 GB)
  • AnonPages: 924844 kB (0,9 GB)
  • Shmem: 374848 kB (0,4 GB)

Von den verbleibenden 0,5 GB sehe ich einige weitere kleine Anwendungen unter insgesamt 0,1 GB. Der Kernel reserviert auch ein paar Prozentpunkte Marge für sich selbst (siehe "Niedrigwassermarke"), aber ich denke, es wären 0,2 GB oder weniger auf Ihrem System. Es gibt also etwas mehr Verwendung, bei der ich mir nicht sicher bin.

Kernel-Plattenspeicher

Der Speicher "Nicht wiedergewinnbare Platte" ist ein weiterer Begriff, der reduziert wird MemAvailable. Sie haben nicht viel: SUnreclaim: 55044 kB(0,05 GB).

Sie können slabtop auch ausführen, um die Liste der Platten anzuzeigen. AFAICT, Slabtop gibt keine Statistiken auf Platten als zurückfordernd oder nicht zurückfordernd an. Aber ich kann normalerweise raten, und wenn es eine verdächtige Platte gibt, können Sie sie beim Namen nachschlagen.

3. Andere Tools, die Sie verwenden könnten - installieren Sie noch atopheute 8-)

smemkönnte übertrieben sein. Manchmal ist alles, was Sie brauchen top, oder Ihre Lieblingsalternative und zu wissen, wie man nach residentem Speicher sortiert. (Obwohl dies gnome-system-monitormöglicherweise keine gute Wahl ist. Ich denke, es zeigt nicht wirklich genug).

Manchmal, wenn Sie ein Leistungsproblem haben, müssen Sie sich stattdessen das Lesen und Schreiben von Datenträgern ansehen. Sie könnten verwenden sudo iotop.

Manchmal möchten Sie ein Protokoll über die Speichernutzung pro Prozess haben, damit Sie sehen können, warum Ihnen der Arbeitsspeicher ausgegangen ist und das System zu einem Crawl verlangsamt wurde ...

atopist ein geschicktes kleines Werkzeug, das all das kann. Wenn dies nützlich klingt, empfehle ich Ihnen, es sofort zu installieren. Dann kannst du es lernen, wenn du es brauchst :-).

sudo atop -Rzeigt "PSIZE" (gleiche Bedeutung wie "PSS"). Das atopPaket enthält einen Hintergrunddienst, der im Abstand von zehn Minuten ausgeführt wird. Sie können atop -r ...damit die Protokolldateien öffnen, die unter / var / log / atop / gespeichert sind.

sourcejedi
quelle
Vielen Dank @sourcejadi. Das smemsieht aus wie ein separates Paket, das nicht mit Arch's Basissystem geliefert wird. Ich musste es installieren, aber ab jetzt ist es besser, smem zu installieren. Auf jeden Fall zeigt der Gnome-System-Monitor diese Anwendungen jedoch auch an (möglicherweise müssen Sie Show Dependencieseine vollständige Liste auswählen )!
Goswami