Уменьшение использования памяти Django. Низко висящий фрукт?

Использование моей памяти увеличивается с течением времени и перезапуск Django не подходит пользователям.

Я не уверен, как сделать профилирование использования памяти, но некоторые советы о том, как начать измерение, будут полезны.

У меня такое ощущение, что есть несколько простых шагов, которые могут принести большие выгоды. Обеспечение "debug" установлено на "False" - это очевидный biggie.

Кто-нибудь может предложить других? Насколько улучшено кэширование на сайтах с низким трафиком?

В этом случае я запускаюсь под Apache 2.x с mod_python. Я слышал, что mod_wsgi немного компактнее, но было бы сложно переключиться на этом этапе, если бы я не знал, что выигрыш будет значительным.

Изменить: Спасибо за советы до сих пор. Любые предложения, как узнать, что использует память? Есть ли какие-либо руководства по профилированию памяти Python?

Также, как упоминалось, есть несколько вещей, которые затруднят переход на mod_wsgi, поэтому я хотел бы иметь некоторое представление о преимуществах, которые я мог ожидать, прежде чем вспахивать вперед в этом направлении.

Изменить: Карл опубликовал немного более подробный ответ здесь, который стоит прочитать: Развертывание Django: сокращение расходов на Apache

Изменить: Статья Грэма Дамплтона - это лучшее, что я нашел в материалах MPM и mod_wsgi. Я довольно разочарован тем, что никто не может предоставить какую-либо информацию об отладке использования памяти в самом приложении.

Final Edit: Хорошо, я обсуждал это с Webfaction, чтобы узнать, могут ли они помочь с перекомпиляцией Apache, и это их слово в этом вопросе:

"Я действительно не думаю, что вы получите большую пользу, переключившись на настройку MPM Worker + mod_wsgi. Полагаю, что вы сможете сэкономить около 20 МБ, но, вероятно, не намного больше".

Итак! Это возвращает меня к моему первоначальному вопросу (о котором я все еще не думаю об этом). Как можно определить, где проблемы? Это хорошо известный принцип, который вы не оптимизируете без тестирования, чтобы увидеть, где вам нужно оптимизировать, но очень мало способов обучения использованию памяти Python и вообще не характерно для Django.

Спасибо за помощь всем, но я думаю, что этот вопрос все еще открыт!

Другое окончательное редактирование; -)

Я спросил об этом в списке пользователей django и получил очень полезные ответы

Честно последнее обновление!

Это только что было выпущено. Может быть лучшим решением: Профилирование размера объекта Django и использования памяти с помощью Pympler

Ответ 1

Убедитесь, что вы не храните глобальные ссылки на данные. Это предотвращает освобождение сборщика мусора python.

Не используйте mod_python. Он загружает интерпретатор внутри apache. Если вам нужно использовать apache, вместо этого используйте mod_wsgi. Переключиться не сложно. Это очень просто. mod_wsgi проще настроить для django, чем мозг-мертв mod_python.

Если вы можете удалить apache из своих требований, это будет еще лучше для вашей памяти. spawning кажется новым быстрым масштабируемым способом запуска веб-приложений python.

EDIT: я не вижу, как переключение на mod_wsgi может быть "сложным". Это должна быть очень простая задача. Пожалуйста, уточните проблему, с которой вы сталкиваетесь с коммутатором.

Ответ 2

Если вы работаете в режиме mod_wsgi и предположительно нерест, так как он совместим с WSGI, вы можете использовать Dozer, чтобы посмотреть на использование вашей памяти.

В mod_wsgi просто добавьте это в нижней части WSGI script:

from dozer import Dozer
application = Dozer(application)

Затем укажите браузер на http://domain/_dozer/index, чтобы просмотреть список всех распределений памяти.

Я также просто добавлю свой голос поддержки mod_wsgi. Это делает мир различий в плане производительности и использования памяти по сравнению с mod_python. Поддержка Graham Dumpleton для mod_wsgi является выдающейся как с точки зрения активной разработки, так и с целью помочь людям в списке рассылки оптимизировать свои установки. Дэвид Крамер в curse.com опубликовал некоторые диаграммы (которых я пока не вижу, к сожалению), демонстрируя резкое сокращение использования процессора и памяти после того, как они переключились на mod_wsgi на этом сайте с высоким трафиком. Несколько из разработчиков django переключились. Серьезно, это без проблем:)

Ответ 3

Это решения для профилирования памяти Python, о которых я знаю (не связанные с Django):

  • Heapy
  • pysizer (прекращено)
  • Валидатор памяти Python (коммерческий)
  • Pympler

Отказ от ответственности: у меня есть доля в последнем.

Отдельная проектная документация должна дать вам представление о том, как использовать эти инструменты для анализа поведения памяти приложений Python.

Ниже приведена хорошая "военная история", которая также дает некоторые полезные указатели:

Ответ 4

Кроме того, проверьте, не используете ли вы какие-либо известные оповещения. MySQLdb, как известно, просачивает огромные объемы памяти с помощью Django из-за ошибки в обработке unicode. Кроме того, панель инструментов Django Debug может помочь вам отслеживать свиней.

Ответ 5

В дополнение к тому, чтобы не поддерживать глобальные ссылки на большие объекты данных, старайтесь избегать загрузки больших наборов данных в память, где это возможно.

Переключитесь на mod_wsgi в режиме демона и используйте рабочий стол Apache mpm вместо prefork. Этот последний шаг может позволить вам обслуживать большее количество одновременных пользователей с гораздо меньшими издержками памяти.

Ответ 6

Webfaction фактически несколько советов для сохранения использования памяти django.

Основные моменты:

  • Убедитесь, что для отладки установлено значение false (вы уже знаете это).
  • Используйте "ServerLimit" в конфигурации apache
  • Убедитесь, что в память не загружены большие объекты.
  • Рассмотрите возможность использования статического контента в отдельном процессе или сервере.
  • Используйте "MaxRequestsPerChild" в конфигурации apache.
  • Узнайте и поймите, сколько памяти вы используете.

Ответ 7

Еще один плюс для mod_wsgi: установите параметр maximum-requests в директиве WSGIDaemonProcess, а mod_wsgi будет перезапускать процесс демона так часто. Не должно быть видимого эффекта для пользователя, кроме медленной загрузки страницы при первом запуске нового процесса, поскольку он будет загружать Django и ваш код приложения в память.

Но даже если у вас есть утечки памяти, это должно привести к тому, что размер процесса станет слишком большим, без прерывания обслуживания ваших пользователей.

Ответ 8

Вот script я использую для mod_wsgi (называемый wsgi.py и помещаю его в мой проект django):

import os
import sys
import django.core.handlers.wsgi

from os import path

sys.stdout = open('/dev/null', 'a+')
sys.stderr = open('/dev/null', 'a+')

sys.path.append(path.join(path.dirname(__file__), '..'))

os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings'
application = django.core.handlers.wsgi.WSGIHandler()

Отрегулируйте параметры myproject.settings и путь по мере необходимости. Я перенаправляю весь вывод на /dev/null, так как mod_wsgi по умолчанию предотвращает печать. Вместо этого используйте журнал.

Для apache:

<VirtualHost *>
   ServerName myhost.com

   ErrorLog /var/log/apache2/error-myhost.log
   CustomLog /var/log/apache2/access-myhost.log common

   DocumentRoot "/var/www"

   WSGIScriptAlias / /path/to/my/wsgi.py

</VirtualHost>

Надеюсь, это по крайней мере поможет вам настроить mod_wsgi, чтобы вы могли понять, имеет ли это значение.

Ответ 9

Кэши: убедитесь, что они очищены. Легко что-то приземлиться в кеш, но никогда не будет GC'd из-за ссылки на кеш.

Код Swig'd: убедитесь, что управление памятью выполнено правильно, его очень легко пропустить в python, особенно с сторонними библиотеками.

Мониторинг. Если можно, получите данные об использовании памяти и хитах. Обычно вы увидите корреляцию между определенным типом запроса и использованием памяти.

Ответ 10

Мы наткнулись на ошибку в Django с большими картами (10 000 предметов). Кажется, что Django пытается загрузить их все в память при создании файла Sitemap: http://code.djangoproject.com/ticket/11572 - эффективно убивает процесс apache, когда Google платит посещение сайт.