Serpens66 hat geschrieben:@miracle173: ich danke dir für deine Antworten :
Pympler sieht ganz gut aus, besonders der teil hier:
https://pythonhosted.org/Pympler/muppy.html#muppy
Ich koennte also alles paar stunden so eine summary erstellen lassen und damit schauen, was so passiert. Werde das wenn ich etwas Zeit habe mal einbauen. Melde mich dann wieder mit dem Ergebnis oder eventuellen Problemen

Hallo zusammen, da bin ich wieder...
Ich habe das Thema so lange ruhen lassen, weil ich nun wie zuvor irgendwo empfohlen wurde, einen automatischen restart in den service eingebaut habe. So wurde der Service also nach ~3 Tagen gekilled, aber sodort wieder neugestartet und das war für mich okay.
Doch nun würde ich das verusrachende Skript gerne 5 mal gleichzeitig mit unterschiedlichen Einstellungen laufen lassen (mithilfe von Multithread)
Dabei habe ich nun leider gemerkt, dass der Kill nun sogar schon nach ~4 Stunden erfolgt. Und das ist mir trotz Neustart doch etwas zu schnell..
Also habe ich jetzt Pympler probiert:
Ca. alle 5 minuten schreibt mein Skript die summary in eine txt Datei (self.memhistory ist für das schreiben in die Datei mit Datum verantwortlich):
Code: Alles auswählen
self.memhistory('\n'.join(summary.format_(summary.summarize(muppy.get_objects()))))
5 Minuten vor einem Kill, sah die Summary so aus:
Code: Alles auswählen
types | # objects | total size
==================================== | =========== | ============
<class 'str | 103292 | 8.79 MB
<class 'list | 28184 | 4.78 MB
<class 'dict | 5762 | 4.33 MB
<class 'type | 725 | 739.23 KB
<class 'code | 4779 | 672.24 KB
<class 'float | 14536 | 340.69 KB
<class 'set | 403 | 169.66 KB
<class 'tuple | 1878 | 125.44 KB
<class 'weakref | 1418 | 110.78 KB
<class 'int | 3256 | 91.18 KB
<class 'wrapper_descriptor | 1146 | 89.53 KB
<class 'builtin_function_or_method | 1104 | 69.00 KB
<class 'method_descriptor | 957 | 67.29 KB
<class 'getset_descriptor | 790 | 55.55 KB
<class 'abc.ABCMeta | 51 | 48.95 KB
Genau so, sah sie aber auch schon stunden zuvor aus... woraus ich schließe, dass hier nicht die Ursache des kills zu finden ist =/
Nun also 2 Fragen:
1) Es könnte theoretisch ja noch ein ruckartiger anstieg sein, der nur im moment des Kills auftritt. Wie würde ich diesen am besten sichtbar machen? Ich könnte anstelle von alle 5 Minuten , alle 20 sekunden so eine summary machen und den "diff" Befehl von pympler verwenden. Nur weiß ich grad nicht, wie ich dabei dann prüfen kann " fals diff >= x" um einen starken anstieg festzustellen...
Aber würde das was bringen? Angenommen es ist wirklich ein Fehler, der in kürzester Zeit tonnenweise Speicher verbraucht, dann wird der wohl auftreten und sofort zum kill führen, ohne dass ich den memory verbrauch vorher checken könnte... ?!
2) Ich verwende, um das Skript in 5 Einstellungen gleichzeitig laufen zu lassen multithreads:
Code: Alles auswählen
class MainClass():
#...
def parallel(self,aufgabenliste):
threads = list(map(Multithread, aufgabenliste))
for thread in threads:
thread.start()
for thread in threads
thread.join()
return(list(thread.result for thread in threads))
class Multithread(threading.Thread):
def __init__(self, aufgabe=0):
if aufgabe:
threading.Thread.__init__(self)
self.aufgabe = aufgabe[0] #ist ja ein Tupel aus funktion und argumenten
self.argumente = aufgabe[1]
self.result = None
return
def run(self):
self.result = self.aufgabe(*self.argumente)
return
Die Funktion die dann mit unterschiedlichen einstellungen laufen soll, wird über die "parallel" funktion aufgerufen und läuft dann in einer Endlosschleife. Die einzige Änderung ist also, dass anstelle von einer Endlosschleife, nun insg 5 endlosschleifen gleichzeitig laufen.
Die memory summary habe ich nur in einer dieser einstellungen erlaubt, weil ich davon ausgehe, dass es die memory vom gesmaten Skript, also auch den anderen 4 schleifen zeigt. Ist das richtig?
Könnte der Memory Verbrauch evlt auch mit der verwendung der Threads zu tun haben?