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.

Foi útil?

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.

scroll top