Оптимизация создания Jinja2 Environment - PullRequest
9 голосов
/ 06 марта 2009

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

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

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

В связи с режимом работы Google AppEngine (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), самый дорогой за весь цикл обработки запросов.

Ответы [ 3 ]

10 голосов
/ 20 июня 2009

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

4 голосов
/ 08 марта 2009

ОК, люди, вот что я получил сегодня на #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] mitsuhiko: из yourapplication.utils import env

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

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

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

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

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

[21:08] mitsuhiko: я знаю

[21:08] mitsuhiko: appengine не имеет маршала

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

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

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

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

1 голос
/ 30 апреля 2009

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

...