python - Cómo registrar el uso de la memoria de una aplicación Django por solicitud
apache memory-leaks (2)
Es posible que esto no cubra completamente su pregunta, pero le recomiendo que pruebe nginx + uwsgi en lugar de apache2 + mod_wsgi. En mis pruebas, resultó ser mucho más estable (mod_wsgi se ahogó en algún momento por completo), mucho más rápido y usa mucha menos memoria (puede que solo solucione todos tus problemas).
Sobre el seguimiento del uso de la memoria, puede crear un middleware simple:
class SaveMemoryUsageMiddleware(object):
def process_response(self, request, response):
# track memory usage here and append to file or db
return response
y añádelo a tus middlewares.
Para el código de seguimiento de memoria, recomiendo revisar: ¿ Memoria total utilizada por el proceso de Python?
Sin embargo, probablemente sería mejor si pudiera evitar hacer esto en producción. Sólo para dev y pruebas para localizar problema real.
¿Conoce una forma eficiente de registrar el uso de memoria de una aplicación django por solicitud?
Tengo una pila de apache / mod_wsgi / django, que generalmente funciona bien, pero a veces un proceso termina consumiendo una gran cantidad de memoria. Los servidores se quedan cortos de memoria, intercambian mucho y los servicios se ralentizan drásticamente.
Esta situación es bastante difícil de arreglar porque no sé a qué solicitud se debe culpar por este comportamiento, no puedo reproducirlo.
Me gustaría tener algo implementado en producción que registre el uso de memoria del proceso antes y después de cada solicitud, con una sobrecarga mínima.
Antes de comenzar a reinventar la rueda, ¿la comunidad de mis colegas djangoists conoce alguna solución existente para resolver este problema? Se agradece la configuración de los registros, middleware, fragmento de código o tal vez de apache log.
Lo que (creo) que no necesito es:
- un conjunto de herramientas de creación de perfiles / depuración en la etapa de desarrollo, ya conozco algunas y las utilizaría si supiera qué perfil / depurar, parece demasiado para ser una supervisión permanente de los servicios que se ejecutan en producción. Además de eso, lo que generalmente se muestra con esos tol es un informe de uso de memoria del código fragmentado, realmente sería útil simplemente señalar la solicitud defectuosa.
- Consejos genéricos sobre cómo optimizar el uso de mem de una aplicación django, bueno, siempre es bueno leerlo, pero la idea aquí es más bien "cómo rastrear eficientemente las solicitudes que deben optimizarse".
Mis resultados de búsqueda más cercanos:
Un middleware de Django para rastrear el uso de la memoria y generar un resultado utilizable inmediatamente, necesita conectar tanto la solicitud de proceso como la respuesta de proceso. En otras palabras, observe la diferencia entre el inicio y el final de la solicitud y registre una advertencia si supera algún umbral.
Un ejemplo completo de middleware es:
import os
import psutil
import sys
THRESHOLD = 2*1024*1024
class MemoryUsageMiddleware(object):
def process_request(self, request):
request._mem = psutil.Process(os.getpid()).memory_info()
def process_response(self, request, response):
mem = psutil.Process(os.getpid()).memory_info()
diff = mem.rss - request._mem.rss
if diff > THRESHOLD:
print >> sys.stderr, ''MEMORY USAGE %r'' % ((diff, request.path),)
return response
Esto requiere que se instale el módulo ''psutil'' para hacer el cálculo de la memoria.
Es una fuerza bruta y puede conducir a falsos positivos en un sistema multihilo. Debido a la carga lenta, también verá que se dispara en las primeras solicitudes contra el nuevo proceso a medida que se cargan las cosas.