Django Celery Memory没有发布

Adr*_*ien 3 django memory-leaks celery django-celery

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

  • Django的== 1.5.4
  • Django的芹菜== 3.1.9
  • AMQP == 1.4.3
  • 海带== 3.0.14
  • librabbitmq == 1.0.3(由/sf/answers/1227935971/建议)

在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 
Run Code Online (Sandbox Code Playgroud)

CELERYD_TASK_TIME_LIMIT按照建议 /sf/answers/1229322321/以及/sf/answers/1395188301/的debug_toolbar建议进行评论

我在shell中启动我的worker:

./manage.py celeryd --settings=dev_settings
Run Code Online (Sandbox Code Playgroud)

然后我发送一个任务:

class ExempleTask(Task):

  def run(self, piProjectId):
    table = []
    for i in range(50000000):
      table.append(1)
    return None
Run Code Online (Sandbox Code Playgroud)

使用django命令:

class Command(BaseCommand):

  def handle(self, *plArgs, **pdKwargs):
    loResult = ExempleTask.delay(1)
    loResult.get()
    return None
Run Code Online (Sandbox Code Playgroud)

附:

./manage.py purge_and_delete_test --settings=dev_settings
Run Code Online (Sandbox Code Playgroud)

我监视内存使用情况:

watch -n 1 'ps ax  -o rss,user,command | sort -nr | grep celery |head -n 5'
Run Code Online (Sandbox Code Playgroud)

每次调用任务时,它都会增加celeryd/worker进程的内存消耗,与其中分配的数据量成比例...

这似乎是一个常见的问题(参见其他stackoverflow链接),但是我无法解决它,即使是最新的依赖项.

谢谢.

Nin*_*ker 5

这是一个Python和操作系统问题,而不是真正的django或芹菜问题.没有太深:

1)一旦从OS请求了进程,进程永远不会释放内存寻址空间.它永远不会说"嘿,我在这里完成了,你可以把它拿回来".在您给出的示例中,我希望过程大小会增长一段时间,然后稳定,可能在高基线上.在您的示例分配之后,您可以调用gc接口强制垃圾收集以查看方式

2)这通常不是问题,因为操作系统将未使用的页面调出,因为您的进程停止访问已解除分配的地址空间.

3)如果您的进程泄漏了对象引用,阻止python从垃圾收集中重新适应该空间以供以后重用该进程,并要求您的进程从操作系统请求更多地址空间,则会出现问题.在某些时候,操作系统会骂叔叔,并且(可能)会用它的oomkiller或类似机制杀死你的进程.

4)如果你正在泄漏,要么修复泄漏或设置CELERYD_MAX_TASKS_PER_CHILD,你的孩子进程将(可能)在开始操作系统之前自杀.

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

还有一些小问题:使用xrangenot range- range将生成所有值,然后迭代该列表.xrange只是一个发电机.设置Django DEBUG = False?