uWSGI не освобождает память

Я попробовал свои силы с очень маленьким приложением django, которое обслуживает в основном html + статический контент без операций с БД. Приложение находится на nginx и uwsgi. У меня также установлен postgres, но для этой проблемы я не выполнял никаких операций с БД.

Я обнаружил, что процесс uwsgi не освобождает память. На этой диаграмме от newrelic вы обнаружите, что объем памяти, занимаемый процессом uwsgi, остается неизменным на уровне ~100 МБ, хотя во время этого застоя не было абсолютно никакой активности с веб-сайтом/приложением.

Также к вашему сведению: процесс app/uwsgi при запуске потреблял всего 56 МБ. Я достиг этого ~ 100 МБ, когда тестировал с помощью ab (бенчмарк Apache) и нажимал -n 1000 -c 10 или примерно в этом диапазоне.

введите здесь описание изображения

Конференция Nginx

server 
{
      listen        80;
      server_name   <ip_address>;

      root        /var/www/mywebsite.com/;
      access_log  /var/www/logs/nginx_access.log;
      error_log   /var/www/logs/nginx_error.log;

      charset             utf-8;
      default_type        application/octet-stream;
      tcp_nodelay         off;
      gzip                on;

      location /static/ 
      {
        alias /var/www/mywebsite.com/static/;
        expires 30d;
        access_log off;
      }

      location / 
      {
          include uwsgi_params;
          uwsgi_pass unix:/var/www/mywebsite.com/django.sock;
      }
}

app_uwsgi.ini

[uwsgi]
plugins = python

; define variables to use in this script
project = myapp
base_dir = /var/www/mywebsite.com
app=reloc
uid = www-data
gid = www-data

; process name for easy identification in top
procname = %(project)

no-orphans = true
vacuum = true
master = true
harakiri = 30
processes = 2

processes = 2
pythonpath = %(base_dir)/
pythonpath = %(base_dir)/src
pythonpath = %(base_dir)/src/%(project)

logto = /var/www/logs/uwsgi.log
chdir = %(base_dir)/src/%(project)
module = reloc.wsgi:application

socket = /var/www/mywebsite.com/django.sock
chmod-socket = 666
chown-socket = www-data

Обновление 1: похоже, это не uwsgi, а процессы python, которые сохраняют определенные структуры данных для более быстрой обработки.


person sprezzatura    schedule 02.05.2013    source источник


Ответы (2)


Для веб-фреймворков характерно загружать свой код в память. Как правило, это не проблема, но было бы неплохо ограничить общее потребление памяти вашим воркером, так как в ходе нескольких запросов потребление памяти отдельным воркером может возрасти.

Когда рабочий достигает или превышает ограничение, он перезапустится после того, как запрос будет обслужен. Это делается с помощью reload_on_rss флага.

то, что вы хотите установить, зависит от памяти, доступной на вашем сервере, и количества рабочих процессов, которые вы используете.

person Jason    schedule 22.10.2014

Вы также можете ограничить максимальное количество запросов на одного исполнителя с помощью max-requests в вашем файле .ini. Это убьет рабочего, обработавшего указанное количество max-requests, и создаст нового.

person Stefano Messina    schedule 16.01.2018