Я переместил свой первый проект Django от DjangoEurope до Webfaction, и это запустило проблему, бывшую похожую на утечку памяти. С каждым использованием памяти запроса серверного процесса повышается приблизительно на 500 КБ. Это никогда не понижается. Это продолжается, пока Webfaction не уничтожает его для использования слишком большой памяти.
Я могу ясно видеть это, когда я обновляю администраторский интерфейс Django в своем браузере (хотя это происходит с каждой страницей, не только с администраторским интерфейсом - я, хотя администраторский интерфейс был бы хорошим тестовым сценарием, потому что нет моего кода непосредственно там). С каждой перезагрузкой браузера использование памяти повышается пара сотни килобайтов.
Я тестирую память с помощью команды, предложенной Webfaction:
ps -u publica -o rss,etime,pid,command
Больше о моей установке:
DEBUG
набор к False
Править: Я создал пустой проект Django - значение по умолчанию конфигурация Django плюс django.contrib.admin
и новая пустая база данных (попробованный и с mysql и с postgresql). Я начал перезагружать администратора Django в своем браузере и следил за использованием памяти. Сначала я видел, что проблема произошла - использование памяти выросло после каждой перезагрузки. Но затем это стабилизировало и прекратило расти. Это согласовывается с тем, как мой исходный проект вел себя на Django Europe. К сожалению, на Webfaction это никогда, кажется, не стабилизировалось (или по крайней мере не в определенных рамках памяти, доступной моей учетной записи). Совет?
Боюсь, у меня нет однозначных ответов. Советы Грэма Дамплтона были очень полезны, но, к сожалению, он не дал ответа (просто комментировал), поэтому нет возможности принять его ответ.
Хотя я до сих пор не решил проблему полностью, вот несколько основных советов другим людям, имеющим аналогичные проблемы:
DEBUG
установлено значение Ложь
mod_python
используйте mod_wsgi
mod_wsgi
(Webfaction обычно устанавливает более старые версии) mod_wsgi
в режиме демона (по умолчанию Webfaction устанавливает его во встроенном режиме) [спасибо Грэму Дамплтону за совет] в первой строке создается выражение, которое отличается от вычисления. Когда вы пытаетесь оценить его, это значит, что он не может найти символ a.
-121--4779928-Потому что это просто не так работают функции Python; не является особым для лямбд:
>>> def foo(x):
... return x + a
>>> foo
<function foo at 0xb7dde454>
>>> foo(2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in foo
NameError: global name 'a' is not defined
Переменные подбираются при использовании, а не при определении функции. Они даже просматриваются каждый раз, когда функция вызывается, что вы определенно найдете неожиданным, если вы исходите из C фон (например), но это не проблема в Python.
-121--4779921-У меня такие же проблемы с веб-действием.
Метод, который я использую, и который веб-функция сказала мне, что я должен продолжать использовать, это запуск cron-задания, которое проверяет память каждые 5 минут или около того, и перезапускает любые приложения, которые выходят из-под контроля.
Из 4 приложений python в веб-действии я в среднем перезапускаю 4 в день.
У меня тоже были проблемы с памятью на Webfaction - они появились только после того, как я добавил пятое приложение. Я попробовал несколько изменений в конфигурации apache, но в итоге мне помог переход на mod_wsgi.
Вы проверяли эти советы? -> http://blog.webfaction.com/tips-to-keep-your-django-mod-python-memory-usage-down
Мы развернули приложение в WebFaction { {1}}, и у нас нет этих проблем.
Вы обслуживаете свои статические файлы, как они рекомендуют?
Кстати, это тоже может быть полезно: http://fightingrabbits.com/archives/198
Я бы посоветовал не гадать.
Взгляните на http://code.google.com/p/django-dowser/ , это очень полезное приложение для обнаружения утечек памяти и выяснения, какие части вашего кода ответственны за это. по потреблению памяти.
Проверьте, включен ли внутренний кэш-память внутрипроцессного кэша, если да, то это может быть проблемой (новые записи кеша при каждом запросе).
Оба модуля mod_python и mod_wsgi загружены в apache?
Я знаю, что mod_wsgi не любит, когда в его сборке есть mod_python. Убедитесь, что он не загружен.