Вопрос

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

Это было полезно?

Решение

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

Другие советы

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

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

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

[21:01] zgoda: и для " горячего " - & GT; http://paste.pocoo.org/show/107014/

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

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

[21:05] mitsuhiko: нравится

[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. Я надеюсь, что со временем все станет лучше.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top