google files engine deploy bootstrap appspot app python google-app-engine jinja2

python - files - Optimizando la creación del entorno Jinja2



google app engine static files (3)

Mi aplicación se ejecuta en Google App Engine y la mayoría de las solicitudes recibe constantemente una bandera amarilla debido al alto uso de la CPU. Utilizando Profiler rastreé el problema hasta la rutina de crear la instancia de jinja2.Environment .

Estoy creando la instancia a nivel de módulo:

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

Debido al modo de funcionamiento Google AppEngine (CGI), este código se puede ejecutar en cada solicitud (su caché de importación de módulos parece almacenar en caché los módulos por segundos en lugar de por minutos).

Estaba pensando en almacenar la instancia de entorno en Memcache, pero parece que no es seleccionable. FileSystemLoader instancia de FileSystemLoader parece ser seleccionable y se puede almacenar en caché, pero no observé ninguna mejora sustancial en el uso de la CPU con este enfoque.

¿Alguien puede sugerir una forma de disminuir la sobrecarga de la creación de la instancia de jinja2.Environment ?

Editar : a continuación es parte (relevante) de la salida del generador de perfiles.

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()

Una llamada, pero hasta donde puedo ver (y esto es coherente en todas mis aplicaciones basadas en GAE), la más costosa en todo el ciclo de procesamiento de solicitudes.


De acuerdo con esta receta de google , puedes usar memcache para almacenar códigos de bytes. También puede almacenar en caché el contenido del archivo de plantilla. Todo en la misma receta


Armin sugirió compilar previamente las plantillas de Jinja2 con el código de Python, y usar las plantillas compiladas en producción. Así que hice un compilador / cargador para eso, y ahora renderiza algunas plantillas complejas 13 veces más rápido, descartando todo el análisis sintáctico. La discusión relacionada con el enlace al repositorio está aquí .


OK, gente, esto es lo que obtuve hoy en #pocoo:

[20:59] zgoda: hola, me gustaría saber si podría optimizar mi proceso de creación de entorno jinja2, el problema -> Optimizar la creación del entorno Jinja2

[21:00] zgoda: tengo salida de generador de perfiles de la aplicación "fría" -> http://paste.pocoo.org/show/107009/

[21:01] zgoda: y para "caliente" -> http://paste.pocoo.org/show/107014/

[21:02] zgoda: me pregunto si podría reducir un poco el costo de la CPU de crear un entorno para solicitudes "frías"

[21:05] mitsuhiko: zgoda: pon la creación env en un módulo que importes

[21:05] mitsuhiko: como

[21:05] mitsuhiko: de yourapplication.utils import env

[21:05] zgoda: ya está allí

[21:06] mitsuhiko: hmm

[21:06] mitsuhiko: creo que el problema es que la plantilla se vuelve a compilar cada acceso

[21:06] mitsuhiko: lamentablemente gae es increíblemente limitado, no sé si puedo hacer mucho ahora

[21:07] zgoda: probé con bytecache de jinja pero no funciona en prod (está en el servidor de desarrollo)

[21:08] mitsuhiko: lo sé

[21:08] mitsuhiko: appengine no tiene mariscal

[21:12] zgoda: mitsuhiko: gracias

[21:13] zgoda: esperaba que estuviera haciendo algo mal y esto puede ser optimizado ...

[21:13] mitsuhiko: zgoda: la próxima versión vendrá con soporte mejorado para appengine, pero aún no estoy seguro de cómo implementar el almacenamiento en caché mejorado para ae

Parece que Armin es consciente de los problemas con el almacenamiento en caché de bytecode en AppEngine y tiene algunos planes para mejorar Jinja2 para permitir el almacenamiento en caché en GAE. Espero que las cosas mejoren con el tiempo.