【发布时间】:2014-03-27 17:02:31
【问题描述】:
我们在我们的应用程序中使用 mongodb。 我们的 python 进程(django 应用程序)从 mongodb 读取数据并根据一些计算发送一个 HttpResponse。 现在的问题是,从 mongodb 读取的数据非常大。 每个查询大小接近 900MB(在某些情况下为 1 Gb)。 我们的 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 的地址空间限制? 有人能指出我们正确的方向吗?
【问题讨论】:
-
我建议找到一个不涉及 1GB 查询大小的解决方案,而不是尝试处理 1GB 查询的症状。
-
同意 Scott,你已经自己发现了问题(你自愿限制了进程的地址空间),有这样影响的请求是个坏主意
-
@roberto :如果我删除 uWSGI 进程的地址空间限制,我仍然面临同样的问题。
-
如果我进一步增加uWSGI进程的地址空间限制呢??
-
你甚至 reload-on-as=1024 reload-on-rss=512,但是如果你仍然得到 python MemoryError (删除三个选项后),你可能已经完全耗尽资源或者你可能有其他一些不受 uWSGI 管理的强制执行。
标签: python django mongodb nginx uwsgi