Django芹菜内存未释放

Django芹菜内存未释放,django,memory-leaks,celery,django-celery,Django,Memory Leaks,Celery,Django Celery,在django项目中,我有以下依赖项: django==1.5.4 django芹菜==3.1.9 amqp==1.4.3 kombu==3.0.14 librabbitmq==1.0.3(根据建议) 在dev_settings.py中: DEBUG = False BROKER_URL = "django://" import djcelery djcelery.setup_loader() CELERYBEAT_SCHEDULER = "djcelery.schedulers.Datab

在django项目中,我有以下依赖项:

  • django==1.5.4
  • django芹菜==3.1.9
  • amqp==1.4.3
  • kombu==3.0.14
  • librabbitmq==1.0.3(根据建议)
在dev_settings.py中:

DEBUG = False
BROKER_URL = "django://"
import djcelery
djcelery.setup_loader()
CELERYBEAT_SCHEDULER = "djcelery.schedulers.DatabaseScheduler"
CELERYD_CONCURRENCY = 2
# CELERYD_TASK_TIME_LIMIT = 10 
CELERYD\u任务\u时间\u限制
debug\u工具栏
一起按此处建议进行注释

我在一个外壳中启动我的工作人员,包括:

./manage.py celeryd --settings=dev_settings
然后我发送一个任务:

class ExempleTask(Task):

  def run(self, piProjectId):
    table = []
    for i in range(50000000):
      table.append(1)
    return None
使用django命令:

class Command(BaseCommand):

  def handle(self, *plArgs, **pdKwargs):
    loResult = ExempleTask.delay(1)
    loResult.get()
    return None
与:

我通过以下方式监控内存使用情况:

watch -n 1 'ps ax  -o rss,user,command | sort -nr | grep celery |head -n 5'
每次调用任务时,它都会增加celeryd/worker进程的内存消耗,这与在其中分配的数据量成比例

这似乎是一个常见的问题(c.f.others stackoverflow链接),但我无法修复它,即使使用最新的依赖项


谢谢。

这是Python和操作系统的问题,不是django或芹菜的问题。不要太深:

1) 进程一旦从操作系统请求内存寻址空间,就永远不会释放内存寻址空间。它从来没有说“嘿,我在这里完成了,你可以把它拿回来”。在您给出的示例中,我希望进程的大小会增长一段时间,然后稳定下来,可能是在一个高基线上。在您的示例分配之后,您可以调用
gc
接口来强制垃圾收集,以了解如何进行垃圾收集

2) 这通常不是问题,因为未使用的页面被操作系统调出,因为您的进程停止访问它已释放的地址空间

3) 如果您的进程泄漏对象引用,阻止python进行垃圾收集以重新分配空间供该进程稍后重用,并要求您的进程从操作系统请求更多的地址空间,那么这就是一个问题。在某个时刻,操作系统会(可能)用它的oomkiller或类似的机制杀死你的进程

4) 如果您正在泄漏,请修复泄漏或为每个子进程设置
CELERYD\u MAX\u TASKS\u
,您的子进程将(可能)在扰乱操作系统之前自杀

这是关于Python内存管理的一个很好的一般性讨论:

还有几件小事: 使用
xrange
而不是
range
-range将生成所有值,然后在该列表上迭代<代码>xrange只是一个生成器。设置Django DEBUG=False吗?

1)我已经尝试了gc.collect(),但它没有改变任何东西2)这里是个问题,因为系统从未释放这个“未使用”的分页内存(Ubuntu 12.04.3 LTS)3)工作人员从未被杀死4)确实这可能是一个解决方案,但是我希望我的进程完成他的任务。。。是的,我正在使用调试=False@adrien关于4)每个孩子的最大任务数只有在任务完成后才会导致孩子退出。它永远不会中止中间处理。
watch -n 1 'ps ax  -o rss,user,command | sort -nr | grep celery |head -n 5'