2014-03-25 2 views
5

У меня есть сайт, основанный на django + uwsgi. некоторые из таблиц имеют почти 1 миллион строк.django + uwsgi огромный объем использования памяти

После нескольких веб-сайтов использований, память VIRT используется процесс uwsgi достигает почти 20GB ... почти убить моего сервера ...

Не могли бы вы сказать, кто-то, что может причиной этой проблемы? это мои таблицы слишком большие? (маловероятно, Pinterest имеет гораздо больше данных). теперь мне пришлось использовать reload-on-as = 10024 reload-on-rss = 4800, чтобы убить рабочих каждые несколько минут .... это больно ... любая помощь?

Вот мой uwsgi.ini файл

[uwsgi]

chdir   = xxx 
module   = xxx.wsgi 
master   = true 
processes  = 2 
socket  =127.0.0.1:8004 
chmod-socket = 664 
no-orphans = true 
#limit-as=256 
reload-on-as= 10024 
reload-on-rss= 4800 
max-requests=250 
uid = www-data 
gid = www-data 
#chmod-socket = 777 
chown-socket = www-data 
# clear environment on exit 
vacuum   = true 
+0

Виртуальная память не означает «физическая память». Сколько rss использует ваши процессы? Вы пытались добавить параметр uWSGI-отчета о памяти, чтобы узнать, какие запросы выделяют больше памяти? Какой адаптер базы данных используется? – roberto

+0

благодарит Роберто за быстрый ответ. Я знаю, что VIRT - это не физическая память. но когда он увеличивается, физическая память RSS также резко возрастает, достигая 6 ГБ. быстро. моя память 32 ГБ, осталось только 180M. – edyssy

+0

только сейчас. Я удалил reload-on-as и reload-on-rss и заметил следующее: VIRT - 17.8GB RES: 7.8GB для процесса uwsgi ... CPU 100%. теперь VIRT составляет 19,8 ГБ и RES 10 ГБ. Я использую mysql. – edyssy

ответ

13

После некоторого копания на stackflow и поиск Google, здесь является решением.

тогда я понял, основной параметр для установки в uwsgi.ini является max_request. Первоначально я установил его как 2000. Теперь установите его как 50. так что он будет воспитывать работников, когда память слишком сильно растет. Затем я попытаюсь выяснить, какой запрос вызывает огромные результаты запроса данных из базы данных. Я закончил поиск этой маленькой строки: amount = sum (x.amount для x в Project.objects.all()) Хотя таблица проекта содержит более 1 миллиона сложных записей. Охватывая огромную память .... поскольку я прокомментировал это ... теперь все работает гладко.

Так что хорошо понимать, как [запрос django работает с базой данных]

+1

Простое извлечение большого количества строк будет использовать большой объем памяти (гораздо хуже, если DEBUG True). Предпочитаете 'Project.objects.all(). Iterator()', если вы используете уникальное использование запрошенных строк. В вашем случае это намного проще: вы бы пощадили всю свою память, используя методы агрегирования запросов Django. –

+0

tks. хорошая идея. – edyssy

+1

Если это 'amount' является полем Django, а не свойством Python, вы можете агрегировать и позволить DB делать сумму так быстрее, чем Python: https://docs.djangoproject.com/en/1.10/topics/db/aggregation/# мошенник листов – alanjds

1

(К сожалению, я не хватает репутации комментировать - так извинениями, если этот ответ не поможет в вашем случае)

У меня была такая же проблема, когда Django запускался на uwsgi/gninx и uwsgi, контролируемый супервизором. Процесс uwsgi-supervisor начался с использования большого количества памяти и потребления 100% -ного процессора, поэтому единственным вариантом было повторное перезапуск uwsgi.

Оказалось, решение было настроить ведение журнала в uwsgi.ini файле:

logto = /var/log/uwsgi.log 

Существует некоторая дискуссия по этому вопросу здесь: https://github.com/unbit/uwsgi/issues/296

+0

спасибо. Я добавил его, если это вызовет аналогичную проблему. – edyssy

Смежные вопросы