web-dev-qa-db-fra.com

Réduire Django Utilisation de la mémoire. Fruits à faible pendaison?

Mon utilisation de la mémoire augmente avec le temps et le redémarrage Django n'est pas bon pour les utilisateurs.

Je ne sais pas comment procéder pour profiler l'utilisation de la mémoire, mais quelques conseils sur la façon de commencer à mesurer seraient utiles.

J'ai le sentiment qu'il existe des étapes simples qui pourraient produire de gros gains. Veiller à ce que le "débogage" soit réglé sur "False" est un problème évident.

Quelqu'un peut-il en suggérer d'autres? Quelle amélioration apporterait la mise en cache sur les sites à faible trafic?

Dans ce cas, je cours sous Apache 2.x avec mod_python. J'ai entendu dire que mod_wsgi était un peu plus maigre, mais il serait difficile de passer à ce stade à moins que je sache que les gains seraient importants.

Edit: Merci pour les conseils jusqu'à présent. Des suggestions pour découvrir ce qui utilise la mémoire? Existe-t-il des guides pour le profilage de la mémoire Python?

De plus, comme mentionné, il y a quelques choses qui rendront difficile le passage à mod_wsgi, donc j'aimerais avoir une idée des gains auxquels je pourrais m'attendre avant de continuer à avancer dans cette direction.

Éditer: Carl a posté ici une réponse un peu plus détaillée qui mérite d'être lue: Déploiement de Django: réduire les frais généraux d'Apache

Éditer: article de Graham Dumpleton est le meilleur que j'ai trouvé sur les trucs liés à MPM et mod_wsgi. Je suis plutôt déçu que personne ne puisse fournir d'informations sur le débogage de l'utilisation de la mémoire dans l'application elle-même.

Édition finale: Eh bien, j'en ai discuté avec Webfaction pour voir s'ils pouvaient aider à recompiler Apache et voici leur mot à ce sujet:

"Je ne pense vraiment pas que vous obtiendrez beaucoup d'avantages en passant à une configuration MPM Worker + mod_wsgi. J'estime que vous pourriez être en mesure d'économiser environ 20 Mo, mais probablement pas beaucoup plus que cela."

Donc! Cela me ramène à ma question initiale (dont je ne suis toujours pas plus sage). Comment identifier où se situe le problème? C'est une maxime bien connue que vous n'optimisez pas sans tester pour voir où vous devez optimiser, mais il y a très peu de tutoriels sur la mesure de Python utilisation de la mémoire et aucun du tout spécifique à Django.

Merci pour l'aide de tout le monde mais je pense que cette question est toujours ouverte!

Un autre montage final; -)

J'ai posé cette question sur la liste des utilisateurs de Django et j'en ai obtenu très réponses utiles

Honnêtement, la dernière mise à jour jamais!

Cela vient d'être publié. Pourrait être la meilleure solution à ce jour: Profilage Django taille de l'objet et utilisation de la mémoire avec Pympler

136
Andy Baker

Assurez-vous de ne pas conserver de références globales aux données. Cela empêche le python garbage collector de libérer la mémoire.

N'utilisez pas mod_python. Il charge un interprète dans Apache. Si vous devez utiliser Apache, utilisez mod_wsgi à la place. Il n'est pas difficile de changer. C'est très facile. mod_wsgi est beaucoup plus facile à configurer pour Django que mort cérébrale mod_python.

Si vous pouvez supprimer Apache de vos besoins, ce serait encore mieux pour votre mémoire. spawning semble être la nouvelle méthode évolutive rapide pour exécuter les applications Web python).

[~ # ~] modifier [~ # ~] : Je ne vois pas comment le passage à mod_wsgi pourrait être " délicat ". Ce devrait être une tâche très facile. Veuillez expliquer le problème que vous rencontrez avec le commutateur.

49
nosklo

Si vous exécutez sous mod_wsgi et que vous générez probablement car il est compatible WSGI, vous pouvez utiliser Dozer pour consulter votre utilisation de la mémoire.

Sous mod_wsgi, ajoutez simplement ceci au bas de votre script WSGI:

from dozer import Dozer
application = Dozer(application)

Pointez ensuite votre navigateur sur http: // domain/_dozer/index pour voir une liste de toutes vos allocations de mémoire.

Je vais également ajouter ma voix de support pour mod_wsgi. Il fait toute la différence en termes de performances et d'utilisation de la mémoire sur mod_python. Le support de Graham Dumpleton pour mod_wsgi est remarquable, à la fois en termes de développement actif et en aidant les personnes sur la liste de diffusion à optimiser leurs installations. David Cramer à curse.com a publié quelques graphiques (que je ne peux malheureusement pas trouver maintenant) montrant la réduction drastique de l'utilisation du processeur et de la mémoire après qu'ils soient passés à mod_wsgi sur ce site à fort trafic. Plusieurs des développeurs Django ont changé. Sérieusement, c'est une évidence :)

28
Van Gale

Ce sont les solutions Python profileur de mémoire que je connais (pas Django):

Avertissement: j'ai un intérêt dans ce dernier.

La documentation du projet individuel devrait vous donner une idée de la façon d'utiliser ces outils pour analyser le comportement de la mémoire des applications Python.

Ce qui suit est une belle "histoire de guerre" qui donne également quelques conseils utiles:

14
Pankrat

De plus, vérifiez si vous n'utilisez aucun des fuites connus. MySQLdb est connu pour fuir d'énormes quantités de mémoire avec Django en raison d'un bogue dans la gestion unicode. Autre que cela, Django Debug Toolbar pourrait vous aider à suivre les porcs.

5
zgoda

En plus de ne pas conserver les références globales aux gros objets de données, essayez d'éviter de charger des ensembles de données volumineux dans la mémoire lorsque cela est possible.

Basculez vers mod_wsgi en mode démon et utilisez le mpm de travail d'Apache au lieu de préfork. Cette dernière étape peut vous permettre de servir beaucoup plus d'utilisateurs simultanés avec beaucoup moins de surcharge de mémoire.

4
Carl Meyer

Webfaction a en fait quelques conseils pour garder Django utilisation de la mémoire en baisse.

Les points majeurs:

  • Assurez-vous que le débogage est défini sur false (vous le savez déjà).
  • Utilisez "ServerLimit" dans votre configuration Apache
  • Vérifiez qu'aucun gros objet n'est chargé en mémoire
  • Envisagez de diffuser du contenu statique dans un processus ou un serveur distinct.
  • Utilisez "MaxRequestsPerChild" dans votre configuration Apache
  • Découvrez et comprenez la quantité de mémoire que vous utilisez
4
Jason Baker

Un autre avantage pour mod_wsgi: définissez un maximum-requests dans votre directive WSGIDaemonProcess et mod_wsgi redémarrera le processus démon de temps en temps. Il ne devrait y avoir aucun effet visible pour l'utilisateur, à part un chargement de page lent la première fois qu'un nouveau processus est lancé, car il chargera Django et votre code d'application en mémoire.

Mais même si vous faites avez des fuites de mémoire, cela devrait empêcher la taille du processus de devenir trop importante, sans avoir à interrompre le service à vos utilisateurs.

3
AdamKG

Voici le script que j'utilise pour mod_wsgi (appelé wsgi.py, et mettre à la racine de mon 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()

Ajustez myproject.settings et le chemin si nécessaire. Je redirige toutes les sorties vers/dev/null car mod_wsgi par défaut empêche l'impression. Utilisez plutôt la journalisation.

Pour 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>

J'espère que cela devrait au moins vous aider à configurer mod_wsgi afin que vous puissiez voir si cela fait une différence.

3
Staale

Caches: assurez-vous qu'ils sont vidés. Il est facile pour quelque chose d'atterrir dans un cache, mais ne jamais être GC'd à cause de la référence du cache.

Code Swig'd: Assurez-vous que toute gestion de la mémoire se fait correctement, il est vraiment facile de les manquer en python, en particulier avec les bibliothèques tierces

Surveillance: si vous le pouvez, obtenez des données sur l'utilisation de la mémoire et les hits. Habituellement, vous verrez une corrélation entre un certain type de demande et l'utilisation de la mémoire.

1
Richard Levasseur

Nous sommes tombés sur un bogue dans Django avec de grands sitemaps (10.000 éléments). Semble Django essaie de les charger tous en mémoire lors de la génération du plan du site: - http://code.djangoproject.com/ticket/11572 - tue efficacement le processus Apache lorsque Google effectue une visite sur le site.

1
Emil Stenström