Уменьшение Использования Памяти 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):

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

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