Meine Speichernutzung nimmt mit der Zeit zu und ein Neustart von Django ist nicht benutzerfreundlich.
Ich bin mir nicht sicher, wie ich die Speichernutzung profilieren soll, aber einige Tipps zum Starten der Messung wären hilfreich.
Ich habe das Gefühl, dass es einige einfache Schritte gibt, die große Gewinne bringen könnten. Es ist offensichtlich, dass "Debug" auf "False" gesetzt ist.
Kann jemand andere vorschlagen? Wie viel Verbesserung würde das Caching auf Websites mit geringem Datenverkehr bewirken?
In diesem Fall laufe ich unter Apache 2.x mit mod_python. Ich habe gehört, dass mod_wsgi etwas schlanker ist, aber es wäre schwierig, zu diesem Zeitpunkt zu wechseln, wenn ich nicht weiß, dass die Gewinne signifikant wären.
Edit: Danke für die bisherigen Tipps. Irgendwelche Vorschläge, wie Sie herausfinden können, was den Speicher belegt? Gibt es Anleitungen zur Python-Speicherprofilerstellung?
Wie bereits erwähnt, gibt es einige Dinge, die es schwierig machen, zu mod_wsgi zu wechseln. Daher möchte ich eine Vorstellung von den Gewinnen haben, die ich erwarten könnte, bevor ich in diese Richtung vorwärts pflüge.
Bearbeiten: Carl hat hier eine etwas detailliertere Antwort veröffentlicht, die es wert ist, gelesen zu werden: Django-Bereitstellung: Schneiden von Apaches Overhead
Bearbeiten: Graham Dumpletons Artikel ist der beste, den ich über MPM und mod_wsgi gefunden habe. Ich bin ziemlich enttäuscht, dass niemand Informationen zum Debuggen der Speichernutzung in der App selbst bereitstellen konnte.
Final Edit: Nun, ich habe dies mit Webfaction besprochen, um zu sehen, ob sie beim Neukompilieren von Apache helfen können, und dies ist ihr Wort in dieser Angelegenheit:
"Ich glaube wirklich nicht, dass Sie durch den Wechsel zu einem MPM Worker + mod_wsgi-Setup einen großen Nutzen erzielen werden. Ich schätze, dass Sie möglicherweise etwa 20 MB sparen können, aber wahrscheinlich nicht viel mehr."
So! Dies bringt mich zurück zu meiner ursprünglichen Frage (über die ich immer noch nicht klüger bin). Wie kann man herausfinden, wo die Probleme liegen? Es ist eine bekannte Maxime, dass Sie nicht optimieren, ohne zu testen, wo Sie optimieren müssen, aber es gibt nur sehr wenige Tutorials zum Messen der Python-Speichernutzung und keine für Django spezifischen.
Vielen Dank für die Unterstützung aller, aber ich denke, diese Frage ist noch offen!
Noch eine letzte Bearbeitung ;-)
Ich habe dies auf der Django-Benutzerliste gefragt und einige sehr hilfreiche Antworten erhalten
Ehrlich gesagt das letzte Update überhaupt!
Dies wurde gerade veröffentlicht. Könnte die bisher beste Lösung sein: Profilierung der Django-Objektgröße und der Speichernutzung mit Pympler
quelle
Wenn Sie unter mod_wsgi ausgeführt werden und vermutlich spawnen, da es WSGI-kompatibel ist, können Sie Dozer verwenden , um Ihre Speichernutzung zu überprüfen.
Fügen Sie unter mod_wsgi dies am Ende Ihres WSGI-Skripts hinzu:
Zeigen Sie dann mit Ihrem Browser auf http: // domain / _dozer / index , um eine Liste aller Speicherzuordnungen anzuzeigen .
Ich werde auch nur meine Stimme der Unterstützung für mod_wsgi hinzufügen. Es macht einen großen Unterschied in Bezug auf Leistung und Speichernutzung gegenüber mod_python. Graham Dumpletons Unterstützung für mod_wsgi ist hervorragend, sowohl im Hinblick auf die aktive Entwicklung als auch auf die Unterstützung von Personen auf der Mailingliste bei der Optimierung ihrer Installationen. David Cramer von curse.com hat einige Diagramme veröffentlicht (die ich derzeit leider nicht finden kann), die die drastische Reduzierung der CPU- und Speicherauslastung zeigen, nachdem sie auf dieser stark frequentierten Website zu mod_wsgi gewechselt sind. Einige der Django-Entwickler haben gewechselt. Im Ernst, es ist ein Kinderspiel :)
quelle
Dies sind die mir bekannten Python-Speicherprofiler-Lösungen (nicht Django-bezogen):
Python Memory Validator (kommerziell)Haftungsausschluss: Ich bin an letzterem beteiligt.
Die Dokumentation des einzelnen Projekts sollte Ihnen eine Vorstellung davon geben, wie Sie diese Tools zur Analyse des Speicherverhaltens von Python-Anwendungen verwenden können.
Das Folgende ist eine schöne "Kriegsgeschichte", die auch einige hilfreiche Hinweise gibt:
quelle
Überprüfen Sie außerdem, ob Sie keine bekannten Leckagen verwenden. Es ist bekannt, dass MySQLdb aufgrund eines Fehlers bei der Unicode-Behandlung enorme Speichermengen mit Django verliert. Ansonsten kann Ihnen die Django Debug Toolbar helfen, die Schweine zu verfolgen.
quelle
django-debug-toolbar
helfen?Vermeiden Sie es, große Datenmengen in den Speicher zu laden, wo immer dies möglich ist, und vermeiden Sie nicht nur globale Verweise auf große Datenobjekte.
Wechseln Sie im Daemon-Modus zu mod_wsgi und verwenden Sie Apaches Worker-MPM anstelle von Prefork. Mit diesem letzten Schritt können Sie viel mehr gleichzeitige Benutzer mit viel weniger Speicheraufwand bedienen.
quelle
Webfaction enthält einige Tipps, um die Django-Speichernutzung gering zu halten.
Die wichtigsten Punkte:
quelle
Ein weiteres Plus für mod_wsgi: Legen Sie einen
maximum-requests
Parameter in IhrerWSGIDaemonProcess
Direktive fest und mod_wsgi startet den Daemon-Prozess von Zeit zu Zeit neu. Es sollte keinen sichtbaren Effekt für den Benutzer geben, außer einem langsamen Laden der Seite beim ersten Aufrufen eines neuen Prozesses, da Django und Ihr Anwendungscode in den Speicher geladen werden.Aber auch wenn Sie tun Speicherlecks haben, dass der Prozess der Größe von immer zu groß halten sollte, ohne an die Benutzer zu Interrupt - Service zu haben.
quelle
Hier ist das Skript, das ich für mod_wsgi verwende (wsgi.py genannt und in die Wurzel meines Django-Projekts eingefügt):
Passen Sie myproject.settings und den Pfad nach Bedarf an. Ich leite alle Ausgaben nach / dev / null um, da mod_wsgi standardmäßig das Drucken verhindert. Verwenden Sie stattdessen die Protokollierung.
Für Apache:
Hoffentlich sollte dies Ihnen zumindest dabei helfen, mod_wsgi einzurichten, damit Sie sehen können, ob es einen Unterschied macht.
quelle
Caches: Stellen Sie sicher, dass sie gespült werden. Es ist einfach, dass etwas in einem Cache landet, aber aufgrund der Cache-Referenz niemals GC-fähig wird.
Swig'd-Code: Stellen Sie sicher, dass die Speicherverwaltung korrekt ausgeführt wird. Diese können in Python leicht übersehen werden, insbesondere bei Bibliotheken von Drittanbietern
Überwachung: Wenn Sie können, erhalten Sie Daten zur Speichernutzung und zu Treffern. Normalerweise sehen Sie eine Korrelation zwischen einer bestimmten Art von Anforderung und der Speichernutzung.
quelle
Wir sind über einen Fehler in Django mit großen Sitemaps (10.000 Artikel) gestolpert. Anscheinend versucht Django beim Generieren der Sitemap, sie alle in den Speicher zu laden: http://code.djangoproject.com/ticket/11572 - Beendet den Apache-Prozess effektiv, wenn Google die Website besucht.
quelle