Pregunta

Mi aplicación se está ejecutando en el motor de aplicaciones de Google y la mayoría de las solicitudes recibe una marca amarilla constantemente debido al alto uso de la CPU. Usando el generador de perfiles, rastreé el problema hasta la rutina de creación de la instancia 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 operación de Google AppEngine (CGI), este código se puede ejecutar en todas y cada una de las solicitudes (su caché de importación de módulos parece almacenar módulos en caché por segundos en lugar de por minutos).

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

Cualquiera puede sugerir una forma de reducir la sobrecarga de crear la instancia 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 por lo que 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.

¿Fue útil?

Solución

Armin sugirió compilar previamente las plantillas Jinja2 en código python, y usar las plantillas compiladas en producción. Así que he creado un compilador / cargador para eso, y ahora rinde algunas plantillas complejas 13 veces más rápido, eliminando a todas la sobrecarga de análisis. La discusión relacionada con el enlace al repositorio es aquí .

Otros consejos

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

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

[21:00] zgoda: tengo salida de perfilador de " frío " aplicación - > 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 el entorno para el " frío " solicitudes

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

[21:05] mitsuhiko: me gusta

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

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

[21:06] mitsuhiko: hmm

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

[21:06] mitsuhiko: desafortunadamente, gae es increíblemente limitado, no sé si hay mucho que pueda hacer actualmente

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

[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 se puede optimizar ...

[21:13] mitsuhiko: zgoda: la próxima versión vendrá con un soporte mejorado de 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.

De acuerdo con esta receta Google puedes usar memcache para almacenar en caché los bytecodes. También puede almacenar en caché el contenido del archivo de plantilla. Todo en la misma receta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top