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 update
fehlschlägt (wahrscheinlich, weil der Speicher voll ist)
Verwenden Ubuntu 11.10
quelle
Antworten:
memprof
Quelle: Ubuntu-Handbuch
quelle
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
/tmp
zu einem anderen Dateisystem mit genügend Speicherplatz wechselnSchritte zum Auffinden von Memory Leak
Ermitteln Sie die PID des Prozesses, der einen Speicherverlust verursacht (Sie können sie auch verwenden,
htop
wenn sie verfügbar sind), und speichern Sie sie in einer aufgerufenen Variablenpid
Vorausgesetzt, dass die PID in der Variablen verfügbar ist
pid
, können Sie den Speicherverbrauch mit erfassen/proc/$pid/smaps
und in eine Datei wiebeforeMemInc.txt
.Nimm es
/proc/$pid/smaps
erneut auf und speichere es alsafterMemInc.txt
Finden Sie den Unterschied zwischen erstem
smaps
und zweitemsmaps
, zB mitNotieren Sie sich den Adressbereich, in dem der Speicher vergrößert wurde, zum Beispiel:
Verwenden Sie GDB, um den Arbeitsspeicher bei laufendem Prozess zu sichern oder den Coredump mit abzurufen
Ich habe gdb für den laufenden Prozess verwendet, um den Speicher in eine Datei zu verschieben.
Verwenden Sie nun den
strings
Befehl oderhexdump -C
, um die zu druckenmemory.dump
Daraus erhalten Sie lesbare Informationen, die Ihnen helfen, diese Zeichenfolgen in Ihrem Quellcode zu finden.
quelle
cat /proc/2882/smaps > /tmp/before.txt
ich in Schritt 2 ausgeführt werde. Was habe ich falsch gemacht?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.
Sie können auch die Shared Memory-Reservierung überprüfen, aber Sie wissen nur, wer der Eigentümer der Segmente ist.
Pmap-Zuordnung:
Beachten Sie, dass die reservierten Zuordnungen viel höher sind als die zugewiesenen Seiten (df 'used').
System V-Zuordnungen:
Bearbeiten : Müssen übergeben werden
--sort -rss
,ps
um die Prozesse mit der höchsten Speichernutzung abzurufen. Andernfalls wird die Prozessliste numerisch aufsteigend sortiert und gibt die Prozesse mit der geringsten Speichernutzung an.quelle
Ich verwende einen älteren Computer, der ständig Speicherverlustmeldungen ausgibt:
Mein Drehbuch:
Benannt es
cache.sh
Sie können sehen, ich war auf 374 MB, lief die
sync; sudo echo 3 > /proc/sys/vm/drop_caches
und gewann 417 MB zurück. Man kanncron
es 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 ...quelle
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.quelle
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.
quelle