2009-03-06 8 views
9

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 jinja2.Environment.Optimización de la creación de entorno Jinja2

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 de App Engine de Google (CGI), este código se puede ejecutar todos y cada petición (su caché importación de módulo parece caché 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 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 manera de disminuir la sobrecarga de la creación de 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 consistente a través de todos mis aplicaciones basadas en GAE), el más caro de todo el ciclo de procesamiento de la solicitud.

+0

¿Qué parte de la llamada de Medio Ambiente está causando el dolor? podemos ver la información del perfil? –

+0

Gracias por la información de perfil, realmente no arroja ninguna luz sobre ella (¡aparte de las 4000 llamadas a pickle!). Creo que tendré que ver todo. –

+0

Tal vez venga a #pocoo en freenode, ¿y podemos conversar al respecto? –

Respuesta

10

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

+0

Gracias, Rodrigo, eso es exactamente lo que he estado buscando. :) – zgoda

+0

La mayoría de los enlaces de allí ya no son válidos. ¿Podrías compartir el repositorio? – Bugs

4

bien, la gente, esto es lo que tengo hoy en #pocoo:

[20:59] Zgoda: Hola, me gustaría saber si podría optimizar mi proceso de creación del entorno Jinja2, el problema - >Optimizing Jinja2 Environment creation

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

[21:01] Zgoda: y "caliente" ->

[21 : 02] zgoda: me pregunto si podría bajar un poco el costo de CPU de crear ambiente para las solicitudes "fríos"

[21:05] Mitsuhiko: Zgoda: poner la creación env en un módulo que se importa

[21:05] Mitsuhiko: como

[ 21:05] mitsuhiko: de tu aplicación.utils env importación

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

[21:06] Mitsuhiko: hmm

[21:06] Mitsuhiko: Creo que el problema es que la plantilla se vuelven -compiled cada acceso

[21:06] Mitsuhiko: lamentablemente gae es increíble limitado, no sé si hay mucho que pueda hacer actualmente

[21:07] Zgoda: i trató con jinja bytecache pero no funciona en prod (está en el servidor de desarrollo)

[21:08] Mitsuhiko: 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 de appengine mejorado, pero no estoy seguro sin embargo, 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.

+0

Seguramente tiene que haber una manera de hacerlo cargar al menos aproximadamente tan rápido como la biblioteca de plantillas django incorporada a menos que den algún tipo de privilegio de precarga especial para ello ... – gravitation

+0

Más tarde IRC Armin dijo que tenía una idea de cómo para mejorar las cosas en GAE. Hay alguna esperanza :) – zgoda

+0

Peterh hizo una publicación que podría ser útil: http://groups.google.com/group/google-appengine/msg/cf207d882941cf8d – gravitation

2

Según este google recipe puede 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

+0

mariscal no está disponible en el motor de la aplicación de Google, por lo que parte de la receta no funcionará. De hecho, estoy migrando mi aplicación a jinja. Informará cómo fue – bustrofedon

Cuestiones relacionadas