django + uwsgi巨大的内存使用量问题

edy*_*ssy 8 memory django uwsgi

我有一个基于django + uwsgi的网站.一些表有近100万行.

经过一些网站使用后,使用uwsgi进程的VIRT内存达到了近20GB ...几乎杀了我的服务器......

你能告诉别人可能导致这个问题吗?是我的桌子行太大了吗?(不太可能.Pinterest有更多的数据).现在,我不得不每隔几分钟使用reload-on-as = 10024 reload-on-rss = 4800杀死工人......这很痛苦......有什么帮助吗?

这是我的uwsgi.ini文件

[uwsgi]

chdir           = xxx
module          = xxx.wsgi
master          = true
processes       = 2
socket       =127.0.0.1:8004
chmod-socket    = 664
no-orphans = true
#limit-as=256
reload-on-as= 10024
reload-on-rss= 4800
max-requests=250
uid = www-data
gid = www-data
#chmod-socket = 777
chown-socket = www-data
# clear environment on exit
vacuum          = true
Run Code Online (Sandbox Code Playgroud)

edy*_*ssy 21

在对stackflow和谷歌搜索进行一些挖掘之后,这是解决方案.

然后我想出了在uwsgi.ini中设置的主要参数是max_request.最初,我把它设置为2000.现在设置为50.所以当内存增加太多时它会重生工作.然后我试图找出哪个请求导致数据库的大量数据查询结果.我最终找到了这个小行:amount = sum(x.amount for Project in Project.objects.all())虽然Project表有超过100万个复杂条目.占用大量内存....因为我评论了这个...现在一切顺利.

所以很好理解[django查询如何与数据库一起工作]

  • 简单地获取这么多行将使用大量内存(如果DEBUG为True则更糟糕).首选`Project.objects.all().iterator()`如果您对查询的行进行了独特的使用.在您的情况下,这更简单:您可以使用Django queryset聚合方法节省所有内存. (3认同)
  • 如果这个`amount`是一个Django字段,而不是Python属性,你可以聚合并让DB比Python更快地完成总和:https://docs.djangoproject.com/en/1.10/topics/db/aggregation/ #备忘单 (3认同)