6

我尝试了一个非常小的 django 应用程序,它主要提供 html+静态内容,没有数据库操作。该应用程序位于 nginx 和 uwsgi 上。我也安装了 postgres,但是对于这个问题,我没有做任何数据库操作。

我发现 uwsgi 进程没有释放内存。在 newrelic 的这张图表中,您会发现 uwsgi 进程占用的内存停滞在 ~100MB ,尽管在停滞期间,网站/应用程序绝对没有任何活动。

另外仅供参考:app/uwsgi 进程在启动时仅消耗 56MB。当我使用 ab(apache benchmark) 进行测试并使用 -n 1000 -c 10 或在该范围附近时,我达到了这个 ~100MB。

在此处输入图像描述

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进程。

4

2 回答 2

2

Web 框架通常会将其代码加载到内存中。这通常不是问题,但对工作人员的总内存消耗设置上限并不是一个坏主意,因为在多个请求的过程中,单个工作人员的内存消耗可能会增加。

当工作人员达到或超过上限时,一旦请求得到服务,它将重新启动。这是通过reload_on_rss标志完成的

你想设置什么取决于你的服务器上可用的内存和你正在运行的工作人员的数量。

于 2014-10-22T18:31:35.343 回答
2

您还可以使用文件中的max-requests选项限制每个工作人员的最大请求数.ini。这将杀死已处理指定数量的工人max-requests并产生一个新的工人。

于 2018-01-16T10:04:21.953 回答