Оптимизация создания среды Jinja2

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

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

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

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

Я думал о том, чтобы сохранить экземпляр окружения в кэше памяти, но, похоже, это не приемлемо. Экземпляр 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), самый затратный за весь цикл обработки запроса.


person zgoda    schedule 06.03.2009    source источник
comment
Какая часть вызова среды вызывает боль? мы можем увидеть информацию профиля?   -  person Ali Afshar    schedule 06.03.2009
comment
Спасибо за информацию в профиле, она на самом деле не проливает на нее никакого света (кроме 4000 обращений к pickle!). Думаю, мне нужно все это увидеть.   -  person Ali Afshar    schedule 07.03.2009
comment
Может быть, приедем в #pocoo на freenode, и мы сможем поговорить об этом?   -  person Ali Afshar    schedule 07.03.2009
comment
Мне очень интересно использовать jinja2 в App Engine, поэтому я был бы очень признателен за ваши успехи в этом вопросе.   -  person gravitation    schedule 08.03.2009
comment
Хорошо, я постараюсь собрать как можно больше данных профилирования в разных состояниях.   -  person zgoda    schedule 08.03.2009


Ответы (3)


Армин предложил предварительно скомпилировать шаблоны Jinja2 в код Python и использовать скомпилированные шаблоны в продакшене. Итак, я сделал для этого компилятор / загрузчик, и теперь он отображает некоторые сложные шаблоны в 13 раз быстрее, избавляясь от всех накладных расходов на синтаксический анализ. Соответствующее обсуждение со ссылкой на репозиторий находится здесь.

person moraes    schedule 19.06.2009
comment
Спасибо, Родриго, это именно то, что я искал. :) - person zgoda; 20.06.2009
comment
Большинство ссылок там больше недействительны. Не могли бы вы поделиться репозиторием? - person Bugs; 15.07.2015

Хорошо, народ, вот что я получил сегодня на #pocoo:

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

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

[21:01] zgoda: а для "горячих" -> http://paste.pocoo.org/show/107014/

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

[21:05] mitsuhiko: zgoda: поместите создание env в модуль, который вы импортируете

[21:05] митсухико: нравится

[21:05] митсухико: from yourapplication.utils import env

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

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

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

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

[21:07] zgoda: я пробовал использовать jinja bytecache, но он не работает на prod (на сервере dev)

[21:08] митсухико: я знаю

[21:08] митсухико: у appengine нет маршала

[21:12] zgoda: mitsuhiko: спасибо

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

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

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

person zgoda    schedule 08.03.2009
comment
Конечно, должен быть способ заставить его загружаться хотя бы примерно так же быстро, как встроенная библиотека шаблонов django, если только они не предоставят для него какую-то особую привилегию предварительной загрузки ... - person gravitation; 09.03.2009
comment
Позже IRC Армин сказал, что у него есть идеи, как улучшить GAE. Есть надежда. :) - person zgoda; 09.03.2009
comment
Петер написал сообщение, которое может быть полезным: groups.google.com/group/google -appengine / msg / cf207d882941cf8d - person gravitation; 13.03.2009
comment
Я видел это, кэширующий загрузчик шаблонов - это моя следующая задача по оптимизации, но это не решает накладных расходов на создание env (и повторную компиляцию шаблона при каждом запросе). - person zgoda; 14.03.2009

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

person bustrofedon    schedule 30.04.2009
comment
marshal недоступен в движке приложений Google, поэтому эта часть рецепта не сработает. Я действительно переношу свое приложение на jinja. Расскажу как все прошло - person bustrofedon; 01.05.2009
comment
недопустимая ссылка - person Toskan; 29.01.2019