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?
Memory Leak finden
@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.
Falls der Aufruf nicht hilft, dann gibt es irgendwo ein echtes Speicherleck, also entweder in Deinem Programm, oder in PyPy selbst.
-
- 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
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.
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.
-
- User
- Beiträge: 81
- Registriert: Samstag 14. August 2010, 22:20
Das habe ich jetzt mal ein paar Stunden ausprobiert. Hat leider nichts geändert.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.
Danke das Programm hab ich zwischenzeitlich auch gefunden. Ich werde mich mal einlesen wie das genau funktioniert und dann testen und berichtenDarii 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.