Memory Leak finden

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Herr Lehmann
User
Beiträge: 81
Registriert: Samstag 14. August 2010, 22:20

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?
lunar

@Herr Lehmann Ist das Programm mit CPython denn nachweislich zu langsam?
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.
Herr Lehmann
User
Beiträge: 81
Registriert: Samstag 14. August 2010, 22:20

Zu langsam ist relativ. Mit pypy ist es etwa 40% schneller. Das wäre schon ein schöner gewinn
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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.
Herr Lehmann
User
Beiträge: 81
Registriert: Samstag 14. August 2010, 22:20

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
Antworten