LINUX.ORG.RU

Подскажите, куда копать.

 ,


0

2

Всем добрый день. Знаю, что заголовок не очень информативен, но вкратце лучше не опишешь.
Есть один сайт на django, работающий на достаточно загруженном сервере (кроме этого сайта там еще куча всего работает). Закономерно, в силу загруженности сервера и медлительности самой django и python, все работает не так быстро, как хотелось бы. Но проблема даже не в этом.
В целом главная страница сейчас отдается за ~350 мс. Но периодически (где-то 1 раз из 3-7) она же отдается за ~2c. Как можно отловить, где же оно тормозит и что ему мешает?
Вдобавок могу сказать, что в ходе безуспешных попыток оптимизации было установлено, что как минимум 50% времени обработки запроса занимает рендеринг шаблонов. Кроме того, когда страница отдается долго (~2 с) - время выполнения логики почти не меняется (хотя, все же, увеличивается), время же рендеринга увеличивается почти пропорционально времени генерации всей страницы. Попытались заменить шаблонизатор на Jinja2. При тестировании на локальной машине наблюдалось устойчивое и весьма значительное уменьшение времени отдачи, на сервере же после замены время генерации страницы стало абсолютно случайным, в диапазоне от ~250 мс до 3 с. В чем может быть причина, куда можно копать и смотреть?

★★★

Может у вас на сервере винты дохнут?

VirRaa ★★★
()

кроме этого сайта там еще куча всего работает

Вот эта куча запросто может периодически блочить диск. Можешь все шаблоны тупо сложить в оперативку, в мемкеш там или рам-диск.

anonymous
()
Ответ на: комментарий от anonymous

Была такая идея, сам склоняюсь к тому, что там io виновато.

unikoid ★★★
() автор топика

Я бы посмотрел на своп: какой размер, как используетя и все такое. Есть у меня подозрение что дефицит ОЗУ и недостаточный своп и есть причина этого безобразия.

k0valenk0_igor ★★★
()

Закешируйте все, что можно, а потом разбирайтесь с оптимизациями в отдельном окружении. django-templates известны своей тормознутостью, но если нет специфических ограничений - проще разрулить эту ситуацию тем же кешированием, а не заменой шаблонизатора.

alienclaster ★★★
()

Иопсы надо измерять.iotop, iostat.

Wizard_ ★★★★★
()

Куда вероятнее что затык в БД. Если в шаблон передаются результаты вызовов типа «Topic.objects.filter(...)» то имей в виду, что filter и некоторые другие функции не сразу грузят объекты из БД, а возвращают ленивую коллекцию, загрузка объектов в которую происходит при первом доступе к элементам этой коллекции. Похоже что в данном случае первый доступ происходит во время рендеринга шаблона. Тогда то время рендеринга которое ты намерил, помимо времени непосредственной обработки шаблона включает в себя еще и время для загрузки данных из БД.

anonymous
()

возможно в этот момент много обращений к другим веб-приложениям на сервере?
надо смотреть пики нагрузки и сравнивать

umren ★★★★★
()

я бы действовал последовательно

  • сначала проверил бы статику
  • затем простой шаблон без участия бд
  • затем шаблон с данными из бд
special-k ★★★★
()

django debug toolbar и смотреть что сколько выполняется.

C1nde
()

поддерживаю на счет затыка в БД

pilotys
()

В ORM defer случаем не юзается, у меня была проблема с производительностью из-за этого метода

ASPAnt
()

Внезапно, проблема с рандомным временем генерации страницы решилась достаточно оригинально.
Django работает через nginx в режиме fastcgi.
Если в параметрах ему указать одинаковые значения minspare, maxspare и maxchildren - страница отдается примерно одинаковое время (~300 мс у нас), без всяких флуктуаций. Возможно, при других параметрах то же все будет нормально, есть подозрения, что дело было в разнице между maxspare и maxchildren (точнее, maxspare в принципе не был указан), для меня важнее то, что сейчас все работает довольно стабильно.

Остался открытым вопрос, почему рендеринг с помощью jinja2 таки медленнее (на сервере - почти в 2 раза), чем с помощью стандартного шаблонизатора, хотя обещался значительный прирост.
Кроме того, хотелось бы улучшить время генерации страницы в целом (из которого большую часть отнимает рендеринг).
Может быть, есть какие-то общеизвестные способы и узкие места.
Насчет БД - проверял, все, что используется в шаблонах - к моменту рендеринга уже загружено из БД (либо .get(), либо итерацией, либо еще как-то).

unikoid ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.