Seite 1 von 1

Memory Leak finden

Verfasst: Mittwoch 6. November 2013, 15:55
von Herr Lehmann
Hallo,

ich habe ein recht umfangreiches Python programm (>10k loc). Das läuft 24/7 und bekommt die Daten zur Verarbeitung in regelmäßigen Abständen per upd.
Das Programm brauch unter cpython ca 15MB Ram und nach einer laufzeit von ca. 3 Wochen steht der RAM Verbrauch bei ca 30 MB. Das ist nicht weiter tragisch und so auch nie ins Gewicht gefallen.
Jetzt möchte ich das Programm gerne wegen der Performance mit pypy laufen lassen. Es läuft auch über pypy allerdings geht der Speicherverbrauch innerhalb weniger Stunden ans Limit des Servers. Also es kommen ca 100 MB Ram pro Stunde laufzeit hinzu (jenachdem wieviele Daten per UDP zur Verarbeitung gesendet werden).

Was sind meine Optionen um das Speicherleck zu finden?

Re: Memory Leak finden

Verfasst: Mittwoch 6. November 2013, 16:36
von lunar
@Herr Lehmann Ist das Programm mit CPython denn nachweislich zu langsam?

Re: Memory Leak finden

Verfasst: Mittwoch 6. November 2013, 17:05
von BlackJack
@Herr Lehmann: Hilft es wenn man regelmässig, also zum Beispiel einmal pro Stunde `gc.collect()` aufruft? Falls ja sollte man sich mal mit den Umgebungsvariablen beschäftigen, die das Verhalten der automatischen Speicherbereinigung steuern.

Falls der Aufruf nicht hilft, dann gibt es irgendwo ein echtes Speicherleck, also entweder in Deinem Programm, oder in PyPy selbst.

Re: Memory Leak finden

Verfasst: Mittwoch 6. November 2013, 17:07
von Herr Lehmann
Zu langsam ist relativ. Mit pypy ist es etwa 40% schneller. Das wäre schon ein schöner gewinn

Re: Memory Leak finden

Verfasst: Mittwoch 6. November 2013, 19:35
von Darii
Vielleicht hilft: http://mg.pov.lt/objgraph/#memory-leak-example

Weiß nicht ob das unter pypy geht, aber es ist ja davon auszugehen, dass das leak irgendwo in deinem Programm ist und deswegen wirds wohl auch mit cpython reichen.

Re: Memory Leak finden

Verfasst: Mittwoch 6. November 2013, 20:49
von Herr Lehmann
BlackJack hat geschrieben:@Herr Lehmann: Hilft es wenn man regelmässig, also zum Beispiel einmal pro Stunde `gc.collect()` aufruft? Falls ja sollte man sich mal mit den Umgebungsvariablen beschäftigen, die das Verhalten der automatischen Speicherbereinigung steuern.

Falls der Aufruf nicht hilft, dann gibt es irgendwo ein echtes Speicherleck, also entweder in Deinem Programm, oder in PyPy selbst.
Das habe ich jetzt mal ein paar Stunden ausprobiert. Hat leider nichts geändert.

Darii hat geschrieben:Vielleicht hilft: http://mg.pov.lt/objgraph/#memory-leak-example

Weiß nicht ob das unter pypy geht, aber es ist ja davon auszugehen, dass das leak irgendwo in deinem Programm ist und deswegen wirds wohl auch mit cpython reichen.
Danke das Programm hab ich zwischenzeitlich auch gefunden. Ich werde mich mal einlesen wie das genau funktioniert und dann testen und berichten