Оптимизация создания среды Jinja2
-
03-07-2019 - |
Вопрос
Мое приложение работает на 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 для кэширования байт-кодов.Вы также можете кэшировать само содержимое файла шаблона.Все по одному и тому же рецепту