Django、nginx和uWSGI:uWSGI工作进程不断崩溃并重启

1 投票
1 回答
1928 浏览
提问于 2025-04-18 00:11

我们在应用程序中使用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_params文件:

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;

我的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;
    }
}

我们需要增加python进程的内存限制吗?还是需要增加uWSGI的地址空间限制?有人能给我们指个方向吗?

1 个回答

1

我建议你为你的应用设置内存分析工具。你可以写一个简单的中间件,让它在运行你的视图时进行分析。你可以使用的分析工具是 memory_profiler

撰写回答