Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django、nginx和uWSGI:uWSGI工人不断死亡和重新加载_Python_Django_Mongodb_Nginx_Uwsgi - Fatal编程技术网

Python Django、nginx和uWSGI:uWSGI工人不断死亡和重新加载

Python Django、nginx和uWSGI:uWSGI工人不断死亡和重新加载,python,django,mongodb,nginx,uwsgi,Python,Django,Mongodb,Nginx,Uwsgi,我们在应用程序中使用mongodb。 我们的python进程(django应用程序)从mongodb读取数据,并根据一些计算发送一个HttpResponse。 现在的问题是,从mongodb读取的数据相当大。 每个查询大小接近900MB(在某些情况下为1GB)。 我们的python进程内存不足,抛出一个MemoryError,因此uWSGI工作进程死亡并再次生成 我的uwsgi.conf: [uwsgi] chdir=/var/www/MERU/Meru/deviceapp/me

我们在应用程序中使用mongodb。 我们的python进程(django应用程序)从mongodb读取数据,并根据一些计算发送一个HttpResponse。 现在的问题是,从mongodb读取的数据相当大。 每个查询大小接近900MB(在某些情况下为1GB)。 我们的python进程内存不足,抛出一个MemoryError,因此uWSGI工作进程死亡并再次生成

我的uwsgi.conf:

        [uwsgi]
chdir=/var/www/MERU/Meru/deviceapp/meru_device/
pythonpath=/var/www/MERU/Meru/deviceapp/meru_device/
env=DJANGO_SETTINGS_MODULE=meru_device.settings
module=meru_device.wsgi:application
uid=www-data
gid=www-data
socket=/tmp/da.sock
daemonize=/tmp/da.log
processes=2
master=true
listen=512
harakiri=80
memory-report=true
limit-as=1024
reload-on-as=1024
reload-on-rss=512
pidfile=/tmp/da.pid
chmod-socket=666
vacuum=true
max-requests=5000
我的uwsgi_参数文件:

uwsgi_param  QUERY_STRING       $query_string;
uwsgi_param  REQUEST_METHOD     $request_method;
uwsgi_param  CONTENT_TYPE       $content_type;
uwsgi_param  CONTENT_LENGTH     $content_length;

uwsgi_param  REQUEST_URI        $request_uri;
uwsgi_param  PATH_INFO          $document_uri;
uwsgi_param  DOCUMENT_ROOT      $document_root;
uwsgi_param  SERVER_PROTOCOL    $server_protocol;
uwsgi_param  HTTPS              $https if_not_empty;

uwsgi_param  REMOTE_ADDR        $remote_addr;
uwsgi_param  REMOTE_PORT        $remote_port;
uwsgi_param  SERVER_PORT        $server_port;
uwsgi_param  SERVER_NAME        $server_name;
My nginx.conf:

upstream django {
    server unix:///tmp/da.sock;
}

server {
    listen      8000;
    server_name <my-elastic-ip>;
    charset     utf-8;

    # max upload size
    client_max_body_size 75M;

    location /meru-nms {
        uwsgi_pass  django;
        include     /var/www/MERU/Meru/deviceapp/meru_device/uwsgi_params; # the uwsgi_params file you installed
    add_header 'Access-Control-Allow-Origin' '*';
    add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, OPTIONS';
    add_header 'Access-Control-Allow-Headers' '*';
    add_header 'Access-Control-Max-Age' 1728000;
    }
}
上游django{ 服务器unix:///tmp/da.sock; } 服务器{ 听八千; 服务器名称; 字符集utf-8; #最大上载大小 客户最大尺寸为75M; 位置/meru nms{ uwsgi_pass django; 包括/var/www/MERU/MERU/deviceapp/MERU_device/uwsgi_params;#您安装的uwsgi_params文件 添加标题“访问控制允许源”*; 添加_标题“访问控制允许方法”“GET、POST、PUT、OPTIONS”; 添加_头“访问控制允许头”*; 添加标题“访问控制最大年龄”1728000; } } 我们需要增加python进程的内存限制吗? 或者我们需要增加uwsgi的地址空间限制吗?
有人能为我们指出正确的方向吗?

我建议您为您的应用程序设置内存评测-您可以编写简单的中间件,使用评测器运行视图。作为探查器,您可以使用。

我建议您找到一个不涉及1GB查询大小的解决方案,而不是尝试处理1GB查询的症状。同意Scott的说法,您已经自己发现了问题(您自愿限制了进程的地址空间),有这样影响的请求是不好的idea@roberto:如果我删除uWSGI进程的地址空间限制,我仍然面临同样的问题。如果我进一步增加uWSGI进程的地址空间限制,会怎么样?你甚至在as=1024上重新加载rss=512,但如果你仍然得到python MemoryError(在删除了这三个选项之后),您可能已经完全耗尽了资源,或者您可能有其他一些不受uWSGI管辖的强制执行。