criação Otimizando Jinja2 Ambiente
-
03-07-2019 - |
Pergunta
Meu aplicativo está sendo executado no Google App Engine e a maioria dos pedidos constantemente recebe bandeira amarela devido ao alto uso da CPU. Usando profiler eu segui a questão até a rotina de criação de instância jinja2.Environment
.
Estou a criação da instância no nível de módulo:
from jinja2 import Environment, FileSystemLoader
jinja_env = Environment(loader=FileSystemLoader(TEMPLATE_DIRS))
Devido ao modo de funcionamento do Google AppEngine (CGI), este código pode ser executado para todos e cada solicitação (seu cache importação módulo parece módulos de cache para segundos, em vez de por minutos).
Eu estava pensando sobre como armazenar a instância ambiente no memcache, mas parece não ser picklable. instância FileSystemLoader
parece ser picklable e pode ser armazenado em cache, mas eu não observar qualquer melhoria substancial no uso da CPU com esta abordagem.
Qualquer pessoa pode sugerir uma maneira de diminuir a sobrecarga de criar instância jinja2.Environment
?
Editar :. Abaixo é parte (relevante) da produção profiler
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()
Uma chamada, mas até onde eu posso ver (e isso é consistente em todos os aplicativos meus baseados em GAE), o mais caro em todo o ciclo de solicitação de processamento.
Solução
Armin sugerido para pré-compilar templates Jinja2 para código python e usar os modelos compilados na produção. Então eu fiz um compilador / carregador para isso, e agora torna alguns modelos complexos 13 vezes mais rápido, jogando fora todas a sobrecarga de análise. A discussão relacionada com link para o repositório é href="http://groups.google.com/group/google-appengine-python/browse_thread/thread/04d4bf3dd615ed1e/2907cdeff922710c" aqui .
Outras dicas
OK, as pessoas, este é o que eu tenho hoje em #pocoo:
[20:59] Zgoda: Olá, eu gostaria de saber se eu poderia otimizar meu processo de criação de ambiente Jinja2, o problema -> criação Otimizando Jinja2 ambiente
[21:00] Zgoda: eu tenho saída profiler do app "frio" -> http: //paste.pocoo.org/show/107009/
[21:01] Zgoda: e para a "quente" -> http: // colar. pocoo.org/show/107014/
[21:02] Zgoda: eu estou querendo saber se eu poderia tanto reduzir o custo da CPU de criar ambiente para "frios" solicitações
[21:05] Mitsuhiko: Zgoda: colocar a criação env em um módulo que você importar
[21:05] Mitsuhiko: como
[21:05] Mitsuhiko: de yourapplication.utils importação env
[21:05] Zgoda: ele já está lá
[21:06] Mitsuhiko: hmm
[21:06] Mitsuhiko: eu acho que o problema é que o modelo são re-compilado cada acesso
[21:06] Mitsuhiko: infelizmente GAE é incrível limitado, eu não sei se há muito que eu possa fazer atualmente
[21:07] Zgoda: i tentou com jinja bytecache mas não funciona em prod (sua em no servidor dev)
[21:08] Mitsuhiko: Eu sei
[21:08] Mitsuhiko: appengine não tem marechal
[21:12] Zgoda: Mitsuhiko: obrigado
[21:13] Zgoda: i estava esperando que eu estou fazendo algo errado e isso pode ser otimizado ...
[21:13] Mitsuhiko: Zgoda: próxima versão virá com suporte melhorado appengine, mas eu não tenho certeza ainda como implementar cache aprimorado para ae
Parece Armin está consciente dos problemas com o cache de bytecode em AppEngine e tem alguns planos para melhorar Jinja2 para permitir o armazenamento em cache no GAE. Espero que as coisas vão melhorar ao longo do tempo.