Уменьшение Использования Памяти Django. Низко висящие фрукты?
использование моей памяти увеличивается с течением времени, и перезапуск Django не добр к пользователям.
Я не уверен, как идти о профилировании использования памяти, но некоторые советы о том, как начать измерение было бы полезно.
У меня такое чувство, что есть несколько простых шагов, которые могут принести большие выгоды. Обеспечение "debug" установлено в "False" является очевидным biggie.
может ли кто-нибудь предложить другие? Насколько улучшится кэширование на сайтах с низким трафиком?
In этот случай я запускаю под Apache 2.x с mod_python. Я слышал, что mod_wsgi немного меньше, но было бы сложно переключиться на этом этапе, если я не знаю, что прибыль будет значительной.
Edit: Спасибо за советы до сих пор. Любые предложения, как узнать, что использует память? Есть ли какие-либо руководства по профилированию памяти Python?
также, Как упоминалось, есть несколько вещей, которые затруднят переход на mod_wsgi, поэтому я хотел бы иметь некоторое представление о преимуществах, которые я мог бы ожидайте, прежде чем пахать вперед в этом направлении.
Edit: Карл опубликовал немного более подробный ответ здесь, который стоит прочитать:развертывание Django: сокращение накладных расходов Apache
Edit: Грэм Dumpleton это лучшее, что я нашел на MPM и mod_wsgi связанных вещей. Я довольно разочарован, что никто не может предоставить информацию об отладке использования памяти в самом приложении.
Окончательная Правка: Ну, я обсуждал это с Webfaction, чтобы узнать, могут ли они помочь с перекомпиляцией Apache, и это их слово по этому вопросу:
" я действительно не думаю, что вы получите большую пользу, переключившись на настройку MPM Worker + mod_wsgi. Я считаю, что вы можете сэкономить около 20 МБ, но, вероятно, не намного больше."
Так! Это возвращает меня к моему первоначальному вопросу (который я все еще не мудрее). Как определить, в чем заключаются проблемы? Это хорошо известная максима, что вы не оптимизируете без тестирования, чтобы увидеть, где вам нужно оптимизировать, но очень мало на пути учебников по измерению использования памяти Python и ни одного конкретного для Django.
Спасибо за помощь, но я думаю, что этот вопрос все еще открыт!
еще одно окончательное редактирование; -)
Я спросил об этом в списке пользователей django и есть некоторые очень полезные ответы
честно последнее обновление!
Это только что было выпущено. Может быть лучшим решением:профилирование Джанго размер и памяти с Pympler
10 ответов
убедитесь, что вы не держите глобальные ссылки на данные. Это предотвращает сборщик мусора python от освобождения памяти.
не используйте mod_python
. Он загружает интерпретатор внутри apache. Если вам нужно использовать Apache, используйте mod_wsgi
. Это не сложно переключить. Это очень просто. mod_wsgi
гораздо проще настройка для django чем мозг мертв mod_python
.
если вы можете удалить apache из своих требований, это будет даже лучше для твоей памяти. spawning
кажется, это новый быстрый масштабируемый способ запуска веб-приложений python.
редактировать: Я не вижу, как переход на mod_wsgi может быть "хитрый". Это должна быть очень простая задача. Пожалуйста, подробнее о проблеме, которую вы испытываете с коммутатором.
Если вы работаете под mod_wsgi и предположительно нерест, так как он совместим с WSGI, вы можете использовать бульдозер смотреть на использование памяти.
В разделе mod_wsgi просто добавьте это в нижней части скрипта WSGI:
from dozer import Dozer
application = Dozer(application)
затем в браузере http://domain/_dozer/index чтобы увидеть список всех ваших выделений памяти.
Я также просто добавлю свой голос поддержки mod_wsgi. Это делает мир различий с точки зрения производительность и использование памяти через mod_python. Поддержка Грэм Dumpleton для mod_wsgi является выдающимся, как в условиях активного развития и в оказании помощи людям в списке рассылки для оптимизации их установки. Дэвид Кремер в curse.com опубликовал некоторые диаграммы (которые я не могу найти сейчас, к сожалению), показывающие резкое сокращение использования процессора и памяти после того, как они переключились на mod_wsgi на этом высоком сайте трафика. Несколько разработчиков django переключились. Серьезно, это без проблем:)
Это решения профилировщика памяти Python, о которых я знаю (не связанные с Django):
- бесформенный
- pysizer (снят с производства)
валидатор памяти Python (коммерческий)- Pympler
отказ от ответственности: у меня есть доля в последнем.
документация по отдельному проекту должна дать вам представление о том, как использовать эти инструменты для анализа поведение памяти приложений Python.
ниже приводится хорошая "история войны", которая также дает некоторые полезные указатели:
кроме того, проверьте, не используете ли вы какие-либо известные утечки. MySQLdb, как известно, утечка огромного объема памяти с Django из-за ошибки в обработке unicode. Кроме этого, Панель Инструментов Отладки Django может помочь вам отслеживать свиней.
в дополнение к отсутствию глобальных ссылок на большие объекты данных, старайтесь избегать загрузки больших наборов данных в память везде, где это возможно.
переключитесь на mod_wsgi в режиме демона и используйте рабочий mpm Apache вместо prefork. Этот последний шаг может позволить вам обслуживать гораздо больше одновременных пользователей с гораздо меньшими затратами памяти.
Webfaction на самом деле имеет советы для поддержания использования памяти django вниз.
основные моменты:
- убедитесь, что debug имеет значение false (вы уже это знаете).
- используйте "ServerLimit" в конфигурации apache
- убедитесь, что в память не загружаются большие объекты
- рассмотрите возможность обслуживания статического контента в отдельном процессе или сервере.
- используйте "MaxRequestsPerChild" в вашем apache config
- выяснить и понять, сколько памяти вы используете
еще один плюс для mod_wsgi: установить в своем WSGIDaemonProcess
директива и mod_wsgi будут перезапускать процесс демона так часто. Для пользователя не должно быть видимого эффекта, кроме медленной загрузки страницы при первом попадании нового процесса, поскольку он будет загружать Django и ваш код приложения в память.
но даже если вы do имейте утечки памяти, которые должны держать размер процесса от получать слишком большим, без прервать обслуживание к ваш пользователь.
вот скрипт, который я использую для 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.настройки и путь по мере необходимости. Я перенаправляю весь вывод на /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, чтобы вы могли видеть, имеет ли это значение.
кэши: убедитесь,что они промываются. Его легко для чего-то приземлиться в кэше, но никогда не быть GC'D из-за ссылки на кэш.
кода глоток: убедитесь, что любое управление памятью делается правильно, его очень легко не заметить это в Python, особенно со сторонними библиотеками
наблюдение: если вы можете, получить данные об использовании памяти и хиты. Обычно вы увидите корреляцию между определенным типом запроса и использованием памяти.
мы наткнулись на ошибку в Django с большими картами (10.000 элементов). Кажется, Django пытается загрузить их все в память при создании sitemap:http://code.djangoproject.com/ticket/11572 - эффективно убивает процесс apache, когда Google посещает сайт.