2014-03-27 5 views
0

Мы используем mongodb в нашем приложении. Наш процесс python (приложение django) считывает данные из mongodb и на основании некоторых вычислений отправляет HttpResponse. Теперь проблема в том, что данные, прочитанные из mongodb, довольно велики. Каждый размер запроса составляет около 900 МБ (в некоторых случаях - 1 ГБ). Наш процесс python выходит из памяти и выдает MemoryError, из-за которого рабочий процесс uWSGI умирает и снова появляется.Django, nginx и uWSGI: рабочие 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; 
    } 
} 

нам необходимо увеличить объем памяти для процесса питона ли ? Или нам нужно увеличить ограничение адресного пространства для uwsgi? Может кто-то указать нам в правильном направлении?

+0

Я бы рекомендовал найти решение, которое не включает размеры запросов 1 ГБ, вместо того, чтобы пытаться разобраться с симптомами запроса 1 ГБ. –

+0

согласен с Скоттом, вы уже нашли проблему самостоятельно (вы произвольно ограничили адресное пространство ваших процессов), с запросами с таким воздействием - плохая идея. – roberto

+0

@roberto: У меня по-прежнему возникает такая же проблема. Если я удалю адрес ограничение пространства в процессе uWSGI. – dotslash

ответ

1

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

Смежные вопросы