2009-03-06 5 views
9

Мое приложение работает в Google App Engine, и большинство запросов постоянно получает желтый флаг из-за большого использования ЦП. Используя профайлер, я отследил проблему до подпрограммы создания экземпляра jinja2.Environment.Оптимизация Jinja2 Создание среды

Я создаю экземпляр на уровне модуля:

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

Благодаря режиму работы AppEngine Google (CGI), этот код может быть запущен на каждый запрос (их кэш импорта модуля кажется кэшировать модули на несколько секунд, а не на минуты).

Я думал о хранении экземпляра среды в memcache, но, похоже, он не был сорван. FileSystemLoader экземпляр, по-видимому, имеет разборчивость и может быть кэширован, но я не заметил существенного улучшения использования ЦП при таком подходе.

Кто-нибудь может предложить способ уменьшить накладные расходы при создании экземпляра jinja2.Environment?

Редактировать: ниже часть выходного сигнала профилировщика.

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

Один звонок, но, насколько я могу видеть (и это согласуется во всех моих приложений GAE основе), самый дорогой во всем цикле обработки запроса.

+0

Какая часть вызова Окружающей среды вызывает боль? можно ли просмотреть информацию о профиле? –

+0

Спасибо за информацию о профиле, на самом деле это не проливает свет (кроме 4000 звонков на рассол!). Думаю, мне нужно все это посмотреть. –

+0

Возможно, вы придете в #pocoo на freenode, и мы можем поговорить об этом? –

ответ

10

Armin предложил предварительно скомпилировать шаблоны Jinja2 в код python и использовать скомпилированные шаблоны в процессе производства. Поэтому я сделал для этого компилятор/загрузчик, и теперь он отображает некоторые сложные шаблоны в 13 раз быстрее, отбрасывая все анализирующие накладные расходы. Связанное обсуждение со ссылкой на репозиторий - here.

+0

Спасибо, Родриго, это именно то, что я искал. :) – zgoda

+0

Большинство ссылок на это более актуально. Не могли бы вы поделиться репозиторием? – Bugs

4

OK, люди, это то, что я получил сегодня на #pocoo:

[20:59] Zgoda: привет, я хотел бы знать, если я мог бы оптимизировать процесс создания jinja2 среды, проблема - >Optimizing Jinja2 Environment creation

[21:00] Zgoda: я есть выход профилировщика из "холодного" приложение ->http://paste.pocoo.org/show/107009/

[21:01] Zgoda: и "горячий" ->

[21 : 02] zgoda: Мне интересно, могу ли я несколько снизить Стоимость процессора создания условий для "холодных" запросов

[21:05] Мицухико: Zgoda: поставить создание ENV в модуль импортируемого

[21:05] Мицухико: как

[ 21:05] Мицухико: от тебя.Utils импорт окр

[21:05] Zgoda: это уже есть

[21:06] Мицухико: хмм

[21:06] Мицухико: я думаю, что проблема заключается в том, что шаблон повторно -compiled каждый доступ

[21:06] Мицухико: к сожалению, GAE невероятно ограничено, я не знаю, если есть много я могу сделать в данный момент

[21:07] Zgoda: я попытался с дзиндзя bytecache но он не работает на prod (его на сервере dev)

[21:08] Мицухико~d: я знаю

[21:08] Мицухико~d: AppEngine не маршал

[21:12] Zgoda: Мицухико~d: спасибо

[21 : 13] zgoda: я надеялся, что я делаю что-то неправильно, и это можно оптимизировать ...

[21:13] mitsuhiko: zgoda: в следующем выпуске будет улучшена поддержка appengine, но я не уверен но как реализовать улучшенное кэширование для ae

Похоже, что Armin знает о проблемах с кэшированием байт-кода на AppEngine и планирует некоторые улучшения Jinja2, чтобы обеспечить кеширование на GAE. Надеюсь, со временем все будет лучше.

+0

Конечно, есть способ сделать его загружать, по крайней мере, примерно так же быстро, как встроенная библиотека шаблонов django, если они не дают какой-то специальной привилегии предварительной загрузки для него ... – gravitation

+0

Позже IRC Армин сказал, что у него есть идея, как улучшить ситуацию на GAE. Есть надежда. :) – zgoda

+0

Peterh сделал сообщение, которое может быть полезно: http://groups.google.com/group/google-appengine/msg/cf207d882941cf8d – gravitation

2

В соответствии с этим google recipe вы можете использовать memcache для кэширования байт-кодов. Вы также можете кэшировать содержимое файла шаблона. Все в том же рецепте

+0

Маршал недоступен в Google приложении, поэтому часть рецепта не будет работать. Я действительно переношу свое приложение в jinja. Сообщите, как это получилось. – bustrofedon