Question

Mon application est exécutée sur Google App Engine et la plupart des demandes reçoivent en permanence un drapeau jaune en raison d'une utilisation intensive du processeur. À l'aide de l'éditeur de profil, j'ai suivi le problème jusqu'à la routine de création d'une instance jinja2.Environment .

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 Google AppEngine (CGI), ce code peut être exécuté à chaque requête (le cache d'importation des modules semble mettre en cache les modules pendant quelques secondes plutôt que pendant quelques minutes).

Je pensais au stockage de l'instance d'environnement dans memcache, mais il semble que ce ne soit pas possible. L’instance FileSystemLoader semble être sélectionnable et peut être mise en cache, mais je n’ai observé aucune amélioration substantielle de l’utilisation du processeur avec cette approche.

N'importe qui peut suggérer un moyen de réduire les frais généraux liés à la création d'une instance jinja2.Environment ?

Modifier : la liste ci-dessous fait 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 seul appel, mais autant que je sache (et cela est identique dans toutes mes applications GAE), le plus cher de tout le cycle de traitement des demandes.

Était-ce utile?

La solution

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 créé un compilateur / chargeur pour cela, et il rend maintenant certains modèles complexes 13 fois plus rapides, éliminant ainsi tous les coûts d'analyse. La discussion correspondante avec un lien vers le référentiel est ici .

Autres conseils

OK, c'est ce que j'ai aujourd'hui sur #pocoo:

[20:59] Zgoda: bonjour, j'aimerais savoir si je pourrais optimiser mon processus de création d'environnement jinja2, le problème - > Optimisation de la création d'environnement Jinja2

[21:00] zgoda: j'ai la sortie du profileur de "froid". app - > http://paste.pocoo.org/show/107009/

[21:01] zgoda: and for "hot" - > http://paste.pocoo.org/show/107014/

[21:02] Zgoda: Je me demande si je pourrais quelque peu réduire le coût du processeur pour la création d'un environnement pour "froid". demandes

[21:05] mitsuhiko: zgoda: placez la création env dans un module que vous importez

[21:05] Mitsuhiko: comme

[21:05] mitsuhiko: depuis envoi de votre application.utils

[21:05] zgoda: c'est déjà là

[21:06] mitsuhiko: hmm

[21:06] mitsuhiko: Je pense que le problème est que le modèle est recompilé chaque accès

[21:06] mitsuhiko: Malheureusement, gae est incroyablement limité, je ne sais pas si je peux faire beaucoup de choses actuellement

[21:07] Zgoda: J'ai essayé avec jinja bytecache mais cela ne fonctionne pas avec prod (c'est sur le serveur dev)

[21:08] mitsuhiko: je sais

[21:08] mitsuhiko: Appengine n'a pas de marshal

[21:12] zgoda: mitsuhiko: merci

[21:13] Zgoda: J'espérais que je ferais quelque chose de mal et que cela pourrait être optimisé ...

[21:13] mitsuhiko: zgoda: la prochaine version du logiciel appengine sera améliorée, mais je ne sais pas encore comment implémenter la mise en cache améliorée pour ae

Il semblerait qu'Armin soit conscient des problèmes liés à la mise en cache de code intermédiaire sur AppEngine et envisage d'améliorer Jinja2 pour permettre la mise en cache sur GAE. J'espère que les choses s'amélioreront avec le temps.

Selon cette google recette vous pouvez utiliser memcache pour mettre en cache les codes octets. Vous pouvez également mettre en cache le contenu du fichier de modèle lui-même. Tous dans la même recette

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top