python django profiling memory-management mod-python

python - Reduciendo el uso de la memoria Django. ¿Fruta madura?



profiling memory-management (10)

Además de no guardar referencias globales a objetos de datos grandes, intente evitar cargar grandes conjuntos de datos en la memoria siempre que sea posible.

Cambie a mod_wsgi en el modo daemon, y use el trabajador mpm de Apache en lugar de prefork. Este último paso puede permitirle servir a muchos más usuarios simultáneos con mucha menos sobrecarga de memoria.

Mi uso de memoria aumenta con el tiempo y reiniciar Django no es amable con los usuarios.

No estoy seguro de cómo hacer un perfil del uso de la memoria, pero algunos consejos sobre cómo comenzar a medir serían útiles.

Tengo la sensación de que hay algunos pasos simples que podrían producir grandes ganancias. Asegurar que ''debug'' esté configurado en ''False'' es obviamente obvio.

¿Alguien puede sugerir a otros? ¿Cuánta mejoría sería el almacenamiento en caché en sitios con poco tráfico?

En este caso, me estoy ejecutando en Apache 2.x con mod_python. Escuché que mod_wsgi es un poco más delgado, pero sería complicado cambiar en esta etapa a menos que sepa que las ganancias serían significativas.

Editar: Gracias por los consejos hasta ahora. ¿Alguna sugerencia de cómo descubrir qué está consumiendo la memoria? ¿Hay alguna guía para el perfil de memoria de Python?

Además, como se mencionó, hay algunas cosas que dificultarán cambiar a mod_wsgi, así que me gustaría tener una idea de las ganancias que podría esperar antes de arar hacia adelante en esa dirección.

Editar: Carl publicó aquí una respuesta un poco más detallada que vale la pena leer: Despliegue de Django: recortar los gastos generales de Apache

Editar: El artículo de Graham Dumpleton es el mejor que he encontrado en las cosas relacionadas con MPM y mod_wsgi. Estoy bastante decepcionado de que nadie pueda proporcionar información sobre la depuración del uso de memoria en la aplicación.

Edición final: Bueno, he estado discutiendo esto con Webfaction para ver si pueden ayudar con la recompilación de Apache y esta es su palabra al respecto:

"Realmente no creo que obtengas un gran beneficio al cambiar a una configuración de MPM Worker + mod_wsgi. Estimo que podrías ahorrar alrededor de 20 MB, pero probablemente no mucho más que eso".

¡Asi que! Esto me lleva de vuelta a mi pregunta original (de la que todavía no soy tan prudente). ¿Cómo se puede identificar dónde están los problemas? Es una máxima bien conocida que no se optimiza sin probar para ver dónde se necesita optimizar, pero hay muy pocos tutoriales sobre cómo medir el uso de la memoria de Python y ninguno específico de Django.

Gracias por la ayuda de todos, pero creo que esta pregunta aún está abierta.

Otra edición final ;-)

Le pregunté esto en la lista django-users y obtuve algunas respuestas muy útiles

Honestamente la última actualización!

Esto acaba de ser lanzado. Podría ser la mejor solución hasta ahora: perfilar el tamaño del objeto Django y el uso de la memoria con Pympler


Además, verifique si no usa ninguno de los fugas conocidos. Se sabe que MySQLdb pierde enormes cantidades de memoria con Django debido a errores en el manejo de Unicode. Aparte de eso, Django Debug Toolbar puede ayudarte a rastrear a los cerdos.


Aquí está el script que uso para mod_wsgi (llamado wsgi.py, y puse el raíz de mi proyecto django):

import os import sys import django.core.handlers.wsgi from os import path sys.stdout = open(''/dev/null'', ''a+'') sys.stderr = open(''/dev/null'', ''a+'') sys.path.append(path.join(path.dirname(__file__), ''..'')) os.environ[''DJANGO_SETTINGS_MODULE''] = ''myproject.settings'' application = django.core.handlers.wsgi.WSGIHandler()

Ajuste myproject.settings y la ruta según sea necesario. Redirijo toda la salida a / dev / null ya que mod_wsgi por defecto evita la impresión. Use el registro en su lugar.

Para apache:

<VirtualHost *> ServerName myhost.com ErrorLog /var/log/apache2/error-myhost.log CustomLog /var/log/apache2/access-myhost.log common DocumentRoot "/var/www" WSGIScriptAlias / /path/to/my/wsgi.py </VirtualHost>

Esperemos que al menos esto ayude a configurar mod_wsgi para que pueda ver si hace la diferencia.


Asegúrese de no mantener referencias globales a los datos. Eso evita que el recolector de basura de pitón libere la memoria.

No use mod_python . Carga un intérprete dentro de apache. Si necesita usar apache, use mod_wsgi en mod_wsgi lugar. No es complicado cambiar. Es muy fácil. mod_wsgi es mucho más fácil de configurar para django que mod_python muerte mod_python .

Si puede eliminar apache de sus requisitos, eso sería aún mejor para su memoria. spawning parece ser la nueva forma rápida y escalable de ejecutar aplicaciones web de Python.

EDITAR : No veo cómo cambiar a mod_wsgi podría ser " complicado ". Debería ser una tarea muy fácil. Por favor explique sobre el problema que está teniendo con el interruptor.


Cachés: asegúrese de que estén enrojecidos. Es fácil que algo aterrice en un caché, pero nunca se GC''d debido a la referencia del caché.

Código Swig''d: asegúrese de que la gestión de la memoria se realiza correctamente, es muy fácil pasar esto por alto en python, especialmente con bibliotecas de terceros.

Monitoreo: Si puede, obtenga datos sobre el uso de memoria y visitas. Por lo general, verá una correlación entre un cierto tipo de solicitud y el uso de la memoria.


Estas son las soluciones de generador de perfiles de Python que conozco (no relacionadas con Django):

Descargo de responsabilidad: tengo una participación en este último.

La documentación del proyecto individual debe darle una idea de cómo usar estas herramientas para analizar el comportamiento de la memoria de las aplicaciones Python.

La siguiente es una buena "historia de guerra" que también da algunos consejos útiles:


Nos tropezamos con un error en Django con grandes mapas de sitio (10.000 artículos). Parece que Django está tratando de cargarlos todos en la memoria al generar el mapa del sitio: http://code.djangoproject.com/ticket/11572 - efectivamente mata el proceso de apache cuando Google visita el sitio.


Otra ventaja para mod_wsgi: establezca un parámetro de maximum-requests en su directiva WSGIDaemonProcess y mod_wsgi reiniciará el proceso del daemon de vez en cuando. No debe haber ningún efecto visible para el usuario, salvo una carga de página lenta la primera vez que se golpea un nuevo proceso, ya que cargará Django y el código de la aplicación en la memoria.

Pero incluso si tiene pérdidas de memoria, eso debería evitar que el tamaño del proceso sea demasiado grande, sin tener que interrumpir el servicio a sus usuarios.


Si se está ejecutando bajo mod_wsgi y, presumiblemente, generando ya que es compatible con WSGI, puede utilizar Dozer para ver el uso de la memoria.

En mod_wsgi simplemente agrega esto en la parte inferior de tu script WSGI:

from dozer import Dozer application = Dozer(application)

Luego, http://domain/_dozer/index su navegador a http://domain/_dozer/index para ver una lista de todas sus asignaciones de memoria.

También agregaré mi voz de soporte para mod_wsgi. Hace una gran diferencia en términos de rendimiento y uso de memoria sobre mod_python. El soporte de Graham Dumpleton para mod_wsgi es sobresaliente, tanto en términos de desarrollo activo como en ayudar a las personas en la lista de correo a optimizar sus instalaciones. David Cramer en curse.com ha publicado algunos gráficos (que ahora no puedo encontrar desafortunadamente) que muestran la drástica reducción en el uso de la CPU y la memoria después de que cambiaron a mod_wsgi en ese sitio de alto tráfico. Varios de los desarrolladores de django han cambiado. En serio, es pan comido :)


Webfaction en realidad tiene algunos consejos para mantener el uso de la memoria django.

Los puntos principales:

  • Asegúrese de que la depuración esté configurada en falso (ya lo sabe).
  • Use "ServerLimit" en su configuración de apache
  • Verifique que no se carguen objetos grandes en la memoria
  • Considere servir contenido estático en un proceso o servidor por separado.
  • Use "MaxRequestsPerChild" en su configuración de apache
  • Descubre y entiende cuánta memoria estás usando