Задать вопрос
Sergiy_Hanzhela
@Sergiy_Hanzhela
Начинающий разработчик!

Uwsgi процесс периодически забирает всю память?

Доброго время суток.
Периодически сталкиваюсь с такой проблемой. Работает связка VPS, Django, Nginx + Uwsgi происходит зависание сервера по причине того что один из процессов uwsgi начинает кушать память и пока всю не съест включая swop не останавливается, может кто подскажет как ограничить такое безобразие!
вот мой uwsgi.ini
[uwsgi]
master = true
processes = 5
buffer-size=65535
socket = /tmp/stp.sock
pidfile2 = /tmp/stp.pid
chmod-socket = 666
enable-threads = true
harakiri = 40
reload-on-as = 1100
reload-on-rss= 512
# idle = 10
# die-on-idle = true
wsgi-file=/home/*/stp/stp/wsgi.py

chdir=/home/al*/stp
daemonize=/var/log/uwsgi/*.log
max-requests=5000
plugin=python3
virtualenv=/home/*/envs/stp-env
venv=/home/*/envs/stp-env

какие ещё настройки можно применить в ini
  • Вопрос задан
  • 639 просмотров
Подписаться 1 Средний 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
@deliro
Учитывая то, что воркеры рестартуют каждые 5000 запросов, забивание памяти тут связано (я на 99.9% уверен) с твоим кодом. Сам по себе uWSGI кушает ОЧЕНЬ мало памяти.

Выключен ли DEBUG? При включенном дебаге все SQL запросы остаются в django.db.connection.queries. Если ещё и не оптимизировать N+1 запросы, то на каждый рендер страницы вполне может прийти 500-2000 запросов. Умножая на 5000, получается до 10млн записей. Каждая из них является словарём, который, допустим, занимает 200 байт памяти. Внутри содержится сам SQL, размером, допустим, 80-400 байт и время исполнения.

Итого, если взять по максимуму, каждая запись будет занимать примерно 600 байт * 10млн = 6млрд байт, что примерно равно 5.6гб. На каждый воркер (ведь у тебя каждый воркер — скорее всего процесс, а не тред). Если воркеров штуки 4, получается больше 20гб.

Это один из многих векторов оптимизации.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы