Wie finde ich, welcher Prozess Speicher ausläuft

Ich habe ein System (Ubuntu) mit vielen Prozessen und einem (oder mehr) haben einen Speicherverlust. Gibt es eine gute Möglichkeit, den Prozess zu finden, der das Leck hat? Einige des Prozesses sind JVMs, andere nicht. Einige sind hausgemacht, einige sind Open Source.

Antwort auf "Wie finde ich, welcher Prozess Speicher ausläuft " 7 von antworten

Schwierige Aufgabe. Normalerweise würde ich vorschlagen, einen Debugger/Speicher-Profiler wie Valgrind and run the programs one after one in it. Soon or later you will find the program that leaks and can tell it the devloper or fix it yourself. zu greifen und die Programme eins nach eins in ihm auszuführen. Bald oder später werden Sie das Programm finden, das undicht ist und kann es den Devloper sagen oder es selbst beheben.

Sie können den Befehl top command (to run non-interactively, type ausführen (um nicht interaktiv zu laufen, geben Sie top -b -n 1). To see applications which are leaking memory, look at the following columns: ein). Um Anwendungen zu sehen, die Speicherverluste aufweisen, sehen Sie sich die folgenden Spalten an:

  • RPRVT - Resident private address space size
  • RSHRD - Resident Shared Address Space Size
  • RSIZE - Resident Memory size
  • VPRVT - private Adressraumgröße
  • VSIZE - Gesamtspeichergröße

Wie suggeseted, ist der Weg zu gehen valgrind. Es ist ein Profiler, der viele Aspekte der ausgeführten Leistung Ihrer Anwendung überprüft, einschließlich der Verwendung von Arbeitsspeicher.

Wenn Sie Ihre Anwendung durch Valgrind ausführen, können Sie überprüfen, ob Sie vergessen haben, den mit malloc zugewiesenen Speicher freizugeben, wenn Sie den gleichen Speicher zweimal freigeben usw.

Zusätzlich zu oben können Sie Systemmonitor (System - Administration - System Monitor, dann wählen Sie Prozesse Registerkarte) verwenden. Wählen Sie Ansicht - Alle Prozesse, gehen Sie zu Bearbeiten - Einstellungen und aktivieren Sie die Spalte Virtueller Speicher. Sortieren entweder nach dieser Spalte oder nach Speicherspalte

wenn das Programm über einen langen Zeit undicht ist, ist top möglicherweise nicht praktisch. Ich würde ein einfaches Shell-Skript schreiben, das das Ergebnis von "ps aux" alle X Sekunden an eine Datei anfügt, je nachdem, wie lange es dauert, signifikante Mengen an Speicher zu versickern. Etwa:

while true
do
echo "---------------------------------" >> /tmp/mem_usage
date >> /tmp/mem_usage
ps aux >> /tmp/mem_usage
sleep 60
done

Wenn Sie es nicht abzugsfähig machen können, betrachten Sie das Signal Flare-Debugging-Muster: Erhöhen Sie die Speichermenge, die von einem Prozess zugewiesen wird, um den Faktor zehn. Führen Sie dann Ihr Programm aus.

Wenn die Menge des speicherverlustes gleich ist, war dieser Prozess nicht die Quelle des Lecks; stellen Sie den Prozess wieder her, und nehmen Sie die gleiche Änderung am nächsten Prozess vor.

Wenn Sie den Prozess treffen, der verantwortlich ist, sehen Sie die Größe Ihres Speicherlecks springen (die "Signalflare"). Sie können sie noch weiter eingrenzen, indem Sie die Zuweisungsgröße separater Anweisungen innerhalb dieses Prozesses selektiv erhöhen.

Ich schlage die Verwendung von htop vor, als bessere Alternative zu top.