2009-03-06 11 views
9

Mon application s'exécute sur Google App Engine et la plupart des demandes obtiennent constamment un drapeau jaune en raison de l'utilisation élevée du processeur. En utilisant profiler j'ai suivi le problème à la routine de création jinja2.Environment instance.Optimisation de la création de l'environnement Jinja2

Je crée l'instance au niveau du module:

from jinja2 import Environment, FileSystemLoader 
jinja_env = Environment(loader=FileSystemLoader(TEMPLATE_DIRS)) 

En raison du mode de fonctionnement AppEngine Google (CGI), ce code peut être exécuté sur chaque demande (leur cache d'importation du module semble cache modules pour secondes plutôt que pour minutes).

Je pensais à stocker l'instance d'environnement dans memcache, mais il semble ne pas être picklable. FileSystemLoader instance semble être picklable et peut être mis en cache, mais je n'ai pas observé d'amélioration substantielle de l'utilisation du processeur avec cette approche.

Quelqu'un peut-il suggérer un moyen de réduire le temps de création de l'instance jinja2.Environment?

Édition: ci-dessous est la partie (pertinente) de la sortie du profileur.

222172 function calls (215262 primitive calls) in 8.695 CPU seconds 

ncalls tottime percall cumtime percall filename:lineno(function) 
    33 1.073 0.033 1.083 0.033 {google3.apphosting.runtime._apphosting_runtime___python__apiproxy.Wait} 
438/111 0.944 0.002 2.009 0.018 /base/python_dist/lib/python2.5/sre_parse.py:385(_parse) 
    4218 0.655 0.000 1.002 0.000 /base/python_dist/lib/python2.5/pickle.py:1166(load_long_binput) 
     1 0.611 0.611 0.679 0.679 /base/data/home/apps/with-the-flow/1.331879498764931274/jinja2/environment.py:10() 

Un appel, mais pour autant je peux voir (et cela se retrouve dans toutes mes applications basées sur GAE), le plus cher dans l'ensemble du cycle de traitement des demandes.

+0

Quelle partie de l'appel de l'environnement provoque la douleur? pouvons-nous voir les informations de profil? –

+0

Merci pour les informations de profil, il ne fait pas vraiment la lumière (à part les 4000 appels à cornichons!). Je pense que je vais devoir voir tout ça. –

+0

Peut-être venez-vous sur #pocoo sur freenode, et nous pouvons discuter à ce sujet? –

Répondre

10

Armin a suggéré de pré-compiler les modèles Jinja2 en code python, et d'utiliser les modèles compilés en production. J'ai donc fait un compilateur/chargeur pour cela, et il rend maintenant certains modèles complexes 13 fois plus rapides, en jetant tous les le temps d'analyse. La discussion associée avec le lien vers le référentiel est here.

+0

Merci, Rodrigo, c'est exactement ce que je cherchais. :) – zgoda

+0

La plupart des liens là-bas ne sont plus valides. Pourriez-vous s'il vous plaît partager le référentiel? – Bugs

4

OK, les gens, ce que je suis aujourd'hui #pocoo:

[20:59] Zgoda: Bonjour, je voudrais savoir si je pouvais optimiser mon environnement jinja2 processus de création, le problème - >Optimizing Jinja2 Environment creation

[21:00] Zgoda: i ai sortie du profileur de "froid" app ->http://paste.pocoo.org/show/107009/

[21:01] Zgoda: et "chaud" ->

[21 : 02] zgoda: je me demande si je pourrais un peu baisser le coût CPU de créer un environnement pour les demandes "froides"

[21:05] Mitsuhiko: Zgoda: mettre la création d'env dans un module que vous importez

[21:05] Mitsuhiko: comme

[ 21:05] mitsuhiko: de votre demande.utils env import

[21:05] Zgoda: il est déjà là

[21:06] Mitsuhiko: hmm

[21:06] Mitsuhiko: Je pense que le problème est que le modèle sont re -compiled chaque accès

[21:06] Mitsuhiko: malheureusement Gae est incroyable limitée, je ne sais pas s'il y a beaucoup que je peux faire actuellement

[21:07] Zgoda: J'ai essayé avec Jinja bytecache mais ça ne marche pas sur prod (c'est sur le serveur dev)

[21:08] Mitsuhiko: Je sais

[21:08] Mitsuhiko: AppEngine ne pas maréchal

[21:12] Zgoda: Mitsuhiko: merci

[21 : 13] zgoda: j'espérais que je fais quelque chose de mal et cela peut être optimisé ...

[21:13] mitsuhiko: zgoda: la prochaine version viendra avec un meilleur support appengine, mais je ne suis pas sûr encore comment mettre en œuvre la mise en cache améliorée pour ae

Apparemment, Armin est conscient des problèmes de mise en cache de bytecode sur AppEngine et prévoit d'améliorer Jinja2 pour permettre la mise en cache sur GAE. J'espère que les choses iront mieux avec le temps.

+0

Sûrement il doit y avoir un moyen de le faire charger au moins aussi vite que la bibliothèque de modèles django intégrée à moins qu'ils ne leur donnent un privilège de préchargement spécial ... – gravitation

+0

Plus tard sur IRC Armin a dit qu'il a une idée de comment pour améliorer les choses sur GAE. Il y a un peu d'espoir. :) – zgoda

+0

Peterh a fait un post qui pourrait être utile: http://groups.google.com/group/google-appengine/msg/cf207d882941cf8d – gravitation

2

Selon ce google recipe, vous pouvez utiliser memcache pour mettre en cache des bytecodes. Vous pouvez également mettre en cache le contenu du fichier modèle lui-même. Tous dans la même recette

+0

marshal n'est pas disponible sur google app engine, de sorte qu'une partie de la recette ne fonctionnera pas. Je suis en train de migrer mon application vers jinja. Va raconter comment ça s'est passé – bustrofedon