Ich habe Apache
+ mod_wsgi
+ Django
App. mod_wsgi
läuft im Daemon-Modus.Warum Python keinen Speicher freigibt (unter mod_wsgi + Django)
Ich habe eine Ansicht, die erhebliche Abfrage-Set aus der Datenbank abruft und zusätzlich Array durch Berechnen der Ergebnisse des Abfrage-Sets zuweist und dann dieses Array zurückgibt. Ich verwende keinen Thread lokalen Speicher, globale Variablen oder ähnliches.
Das Problem ist, dass meine App-Speicher frisst relativ zur Anzahl-Threads ich für mod_wsgi gesetzt.
Ich habe kleines Experiment gemacht, indem ich verschiedene Anzahl von Threads in mod_wsgi gesetzt habe und dann meine Ansicht durch curl überprüfe, wie weit wsgi-Prozess Speicher-klettern kann.
Es geht so:
1 thread - 256Mb 2 threads - 400Mb 3 threads - 535Mb 4 threads - 650Mb
Also jeder Thread hinzufügen, um 120-140Mb nach oben Speichernutzung.
Ich scheint wie der ursprüngliche Speicher für die erste Anfrage freigegeben ist nie freigegeben. Im Single-Thread-Szenario wird es wiederverwendet, wenn eine zweite Anfrage (in derselben Ansicht) angekommen ist. Damit kann ich gehen.
Aber wenn ich mehrere Threads verwenden, dann, wenn Anfrage von einem Thread verarbeitet wird, die diese Anfrage nie zuvor ausführen, "speichert" dieser Thread eine andere 140mb irgendwo lokal.
- Wie kann das behoben werden?
- Wahrscheinlich speichert Django einige Daten in TSL. Wenn das der Fall ist, wie kann ich es deaktivieren?
- Alternativ als eine Umgehungsmöglichkeit, ist es möglich, Anfrageausführung an einen bestimmten Thread in
mod_wsgi
zu binden?
Danke.
PS. DEBUG
auf False gesetzt ist in settings.py
Machst du a) das Array nur erstellen, wenn ein Dataset eintrifft und b) es löschen, wenn du damit fertig bist, damit der Garbage Collector es erreichen kann? –
a) - ja; b) - Ich gebe es nicht ausdrücklich an. Ich konvertiere es in JSON und gebe die JSON-Zeichenfolge zurück. –
Wenn Sie nicht del es dann ist es noch in Gebrauch! –