Wie erkenne ich einen Speicherverlust?


16

Ich habe anscheinend einen größeren Speicherverlust auf meinem aktuellen Ubuntu-System

Nachdem ich seltsame Eclipse-Speicherfehler gemeldet hatte ( /ubuntu/148998/eclipse-constant-different-out-of-memory-errors ), wurden heute in meiner Konsole Fehlermeldungen angezeigt, die besagten, dass nicht genügend Speicher vorhanden ist einfache aufgaben erledigen wie eintippen sudo -s- oder sogar -free -m

Das wiederholte Eingeben von 'free -m' zeigte mir, wie schnell mein Arbeitsspeicher von 700 auf 900 MB anstieg und sich in wenigen Sekunden auf eine Größe von 2000 MB erhöhte (nachdem ich den Arbeitsspeicher mit freigegeben hatte echo 3 > /proc/sys/vm/drop_caches).

Eclipse ist nicht die Ursache, ich habe den Prozess komplett abgebrochen und der Widder ging immer noch hoch. Gibt es eine Möglichkeit zu erkennen, woher das Leck kommt? Ich kann mein System nicht einmal mehr aktualisieren, da dies apt-get updatefehlschlägt (wahrscheinlich, weil der Speicher voll ist)

Verwenden Ubuntu 11.10


Ich bin SEHR glücklich, dass ich nicht verrückt bin. Ich hatte das gleiche Problem seit dem Upgrade auf 13.10, aber ich erinnere mich, dass ich es mit 11.10 hatte. Die Frage ist: Verwenden Sie CrashPlan? Ich scheine es darauf beschränkt zu haben, ich weiß nur nicht, wie ich es beheben soll. Ich habe versucht, den Speicher zu optimieren, aber es funktioniert nicht. Ich hoffe, es gibt Ihnen einige Hinweise
Semi-Neuling

Es macht keinen Sinn, den Kernel zu zwingen, Caches zu löschen. Sie werden gelöscht und ihr Speicherplatz wird ohnehin zurückgefordert, sobald ansonsten mehr physischer Speicher benötigt wird. Das erzwungene Löschen beeinträchtigt höchstwahrscheinlich sogar die Gesamtleistung, da nicht zwischengespeicherte Objekte aus einem viel langsameren Sekundärspeicher abgerufen werden müssen. Freier Hauptspeicher ist keineswegs eine gute Sache. Dies ist entweder ein Zeichen für eine schlechte Cache-Verwaltung oder für eine sehr geringe Auslastung.
David Foerster

Antworten:


9

memprof ist ein Tool zum Profilieren der Speichernutzung und zum Auffinden von Speicherlecks. Es kann ein Profil generiert werden, wie viel Speicher von jeder Funktion in Ihrem Programm belegt wurde. Außerdem kann der Speicher durchsucht und nach Blöcken gesucht werden, die Sie zugewiesen haben, auf die jedoch nirgendwo mehr verwiesen wird.

In memprof wird eine Bibliothek vorab geladen, um die Speicherzuweisungsfunktionen der C-Bibliothek zu überschreiben, und Sie müssen Ihr Programm nicht neu kompilieren.

memprof

Quelle: Ubuntu-Handbuch


10

Stellen Sie zunächst sicher, dass ein temporärer Ordner verfügbar ist, in dem ausreichend Speicherplatz vorhanden ist. Die folgenden Befehle erstellen Speicherauszüge, die mehrere GB groß sein können.

Mit dem folgenden Befehl können Sie einen neuen tmp-Ordner erstellen. Möglicherweise möchten Sie /tmpzu einem anderen Dateisystem mit genügend Speicherplatz wechseln

TMPDIR=$(mktemp -d -t -p /tmp)

Schritte zum Auffinden von Memory Leak

  1. Ermitteln Sie die PID des Prozesses, der einen Speicherverlust verursacht (Sie können sie auch verwenden, htopwenn sie verfügbar sind), und speichern Sie sie in einer aufgerufenen Variablenpid

    ps -aux
    
  2. Vorausgesetzt, dass die PID in der Variablen verfügbar ist pid, können Sie den Speicherverbrauch mit erfassen /proc/$pid/smapsund in eine Datei wie beforeMemInc.txt.

    cat /proc/$pid/smaps > $TMPDIR/beforeMemInc.txt
    
  3. Warten Sie einige Zeit, bis sich der Speicherverbrauch erhöht hat.
  4. Nimm es /proc/$pid/smapserneut auf und speichere es alsafterMemInc.txt

    cat /proc/$pid/smaps > $TMPDIR/afterMemInc.txt
    
  5. Finden Sie den Unterschied zwischen erstem smapsund zweitem smaps, zB mit

    diff -u $TMPDIR/beforeMemInc.txt $TMPDIR/afterMemInc.txt
    
  6. Notieren Sie sich den Adressbereich, in dem der Speicher vergrößert wurde, zum Beispiel:

       beforeMemInc.txt            afterMemInc.txt
    ---------------------------------------------------
    2b3289290000-2b3289343000   2b3289290000-2b3289343000  #ADDRESS
    Shared_Clean:    0 kB       Shared_Clean:    0 kB          
    Shared_Dirty:    0 kB       Shared_Dirty:    0 kB
    Private_Clean:   0 kB       Private_Clean:   0 kB
    Private_Dirty:  28 kB       Private_Dirty:  36 kB  
    Referenced:     28 kB       Referenced:     36 kB
    Anonymous:      28 kB       Anonymous:      36 kB  #INCREASE MEM
    AnonHugePages:   0 kB       AnonHugePages:   0 kB
    Swap:            0 kB       Swap:            0 kB
    KernelPageSize:  4 kB       KernelPageSize:  4 kB
    MMUPageSize:     4 kB       MMUPageSize:     4 kB
    Locked:          0 kB       Locked:          0 kB
    VmFlags: rd wr mr mw me ac  VmFlags: rd wr mr mw me ac
    
  7. Verwenden Sie GDB, um den Arbeitsspeicher bei laufendem Prozess zu sichern oder den Coredump mit abzurufen

    gcore -o $TMPDIR/process $PID
    
  8. Ich habe gdb für den laufenden Prozess verwendet, um den Speicher in eine Datei zu verschieben.

    cd $TMPDIR
    gdb -p $pid
    dump memory memory.dump 0x2b3289290000 0x2b3289343000
    
  9. Verwenden Sie nun den stringsBefehl oder hexdump -C, um die zu druckenmemory.dump

    strings memory.dump
    

    Daraus erhalten Sie lesbare Informationen, die Ihnen helfen, diese Zeichenfolgen in Ihrem Quellcode zu finden.

  10. Analysieren Sie Ihre Quelle, um das Leck zu finden.

Ich bin in einem Docker-Container und erhalte den Fehler "Berechtigung verweigert", wenn cat /proc/2882/smaps > /tmp/before.txtich in Schritt 2 ausgeführt werde. Was habe ich falsch gemacht?
Devy

8

Der drop_cache-Trick gibt keinen Speicher frei, sondern setzt den Cache zurück. Verwendet den Befehl ps, wenn Sie ermitteln möchten, welche Prozesse mehr Speicher belegen.

Zum Beispiel, um die Liste der Top 15 der residenten Speicherbenutzer zu überwachen.

$ watch "ps --sort -rss -eo pid,pmem,rss,vsz,comm | head -16"
  PID %MEM   RSS    VSZ COMMAND
 2590 13.4 136892 825000 firefox
 1743 10.7 109020 300780 Xorg
 2067  8.5 86764 1118140 unity-2d-shell
 3307  4.1 42560 627780 unity-2d-spread
 2068  2.9 29904 617644 unity-2d-panel
 2092  2.5 25524 1291204 nautilus
 2457  1.9 20292 530276 gnome-terminal
 2351  1.9 20016 821488 unity-scope-vid
 2161  1.9 19476 531968 unity-panel-ser
 2034  1.7 18256 759716 gnome-settings-
 2074  1.5 16176 518016 nm-applet
 2273  1.5 15452 580416 unity-lens-vide
 2051  1.4 15112 524260 metacity
 2395  1.2 12836 407336 update-notifi

Sie können auch die Shared Memory-Reservierung überprüfen, aber Sie wissen nur, wer der Eigentümer der Segmente ist.

Pmap-Zuordnung:

$ ls -l /run/shm
total 272
-r-------- 1 ed      ed      67108904 Nov 29 18:17 pulse-shm-1884617860
-r-------- 1 lightdm lightdm 67108904 Nov 29 18:11 pulse-shm-2352897759
-r-------- 1 ed      ed      67108904 Nov 29 18:12 pulse-shm-3444873503
-r-------- 1 ed      ed      67108904 Nov 29 18:12 pulse-shm-3485341848
-r-------- 1 lightdm lightdm 67108904 Nov 29 18:11 pulse-shm-535843976
-r-------- 1 ed      ed      67108904 Nov 29 19:12 pulse-shm-789046959
-r-------- 1 ed      ed      67108904 Nov 29 18:38 pulse-shm-863909656

$ df /run/shm 
Filesystem     1K-blocks  Used Available Use% Mounted on
none              509332   272    509060   1% /run/shm

Beachten Sie, dass die reservierten Zuordnungen viel höher sind als die zugewiesenen Seiten (df 'used').

System V-Zuordnungen:

$ ipcs -m 

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x00000000 294912     ed         700        122880     2          dest         
0x00000000 327681     ed         700        4823040    2          dest         
0x00000000 491522     ed         600        393216     2          dest         
0x00000000 589827     ed         700        4578120    2          dest         
0x00000000 425988     ed         700        27852      2          dest         
0x00000000 458757     ed         600        393216     2          dest         

Bearbeiten : Müssen übergeben werden --sort -rss, psum die Prozesse mit der höchsten Speichernutzung abzurufen. Andernfalls wird die Prozessliste numerisch aufsteigend sortiert und gibt die Prozesse mit der geringsten Speichernutzung an.


5

Ich verwende einen älteren Computer, der ständig Speicherverlustmeldungen ausgibt:

root@:~# free -m
             total       used       free     shared    buffers     cached
Mem:          1898       1523        374        131         32        588
-/+ buffers/cache:        902        995
Swap:         1942        480       1462

Mein Drehbuch:

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

Benannt es cache.sh

root@~# ./cache.sh
root@~# free -m
             total       used       free     shared    buffers     cached
Mem:          1898       1106        791        126          1        207
-/+ buffers/cache:        897       1000
Swap:         1942        480       1462

Sie können sehen, ich war auf 374 MB, lief die sync; sudo echo 3 > /proc/sys/vm/drop_cachesund gewann 417 MB zurück. Man kann crones alle 5 Minuten laufen lassen oder einfach ein Terminal geöffnet haben und es laufen lassen, wenn man langsame Leistung sieht. Ja, ich muss der Maschine Speicher hinzufügen ...


Die Formatierung scheint ein Problem zu sein, nicht sicher, wie es behoben werden soll
Warpig

1
Verwenden Sie den Bearbeitungslink unter Ihrem Beitrag. Über dem Textbereich, der auf die Markdown-Formatierungshilfe verweist, befinden sich eine Formatierungssymbolleiste und ein orangefarbenes Fragezeichen .
David Foerster

Bitte werfen Sie einen Blick auf meinen letzten Kommentar zu dieser Frage . Ich bin überzeugt, dass die Idee, Hauptspeicher durch Leeren und Löschen von Caches freizugeben, falsch ist, und ich weiß, dass ich mit dieser Schlussfolgerung nicht allein bin.
David Foerster

Vielen Dank, David ... Ich stimme voll und ganz zu, dass das Leeren / Löschen des Caches falsch ist ... Aber irgendetwas kommt zum Stillstand und lässt die Maschine einfrieren / abstürzen. ..
Warpig

3

memstat ist auch ein gutes Tool, das die von jedem Block belegte Speichermenge sowie die von geladenen Bibliotheken belegte Speichermenge anzeigt . Nicht das beste Tool, aber es lohnt sich, Details und Statistiken zu sammeln.

memstat -w -p pid ist ein guter Befehl.


1
link ist kaputt, ich finde das ist gut
vladkras

1

Ich hatte ein ähnliches Problem, aber mit einer sehr seltsamen Lösung.

Aus irgendeinem unbekannten Grund hatte ich einen Mail-Server auf meinem Laptop. Ich weiß nicht, warum ich ihn hatte ... Ich habe jedoch seinen Dienst heruntergefahren und es stellte sich heraus, dass diese Software auf meinem Laptop einem Ddos-Angriff ausgesetzt war. Danach war alles normal.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.