我尝试了一个非常小的django应用程序,它主要用于html +静态内容,没有数据库操作。该应用程序在nginx和uwsgi上。我也安装了postgres,但是对于这个问题,我没有做任何数据库操作。
我发现uwsgi进程没有释放内存。在这张来自newrelic的图表中,你会发现uwsgi进程所占用的内存仍然停滞在~100MB左右,尽管在这种停滞期间,网站/应用程序一直没有活动。
另外,仅供参考:app / uwsgi进程开始时只耗费56MB。当我用ab(apache基准测试)进行测试并且用-n 1000 -c 10或大约该范围进行测试时,我达到了这个~100MB。
Nginx Conf
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进程。
答案 0 :(得分:1)
Web框架通常将其代码加载到内存中。这通常不是问题,但是对工人的总内存消耗设置上限并不是一个坏主意,因为在几个请求的过程中,个体工作者的内存消耗可能会增长。
当工作人员达到或超过上限时,一旦提供请求,它将自动重新启动。这是通过reload_on_rss
flag
您要将其设置为取决于服务器上的可用内存以及您正在运行的工作人员数量。
答案 1 :(得分:0)
您还可以使用.ini
文件中的max-requests选项限制每个工作人员的最大请求数。这将杀死已处理指定数量的max-requests
并产生新数量的工人。