我有一个部署到Heroku的Django应用,其中一个工作进程正在运行celery(+ celerycam用于监视)。我正在使用RedisToGo的Redis数据库作为代理。我注意到Redis内存不足。

这是我的procfile的样子:

web: python app/manage.py run_gunicorn -b "0.0.0.0:$PORT" -w 3
worker: python lipo/manage.py celerycam & python app/manage.py celeryd -E -B --loglevel=INFO

这是KEYS'*'的输出:
  • “_kombu.binding.celeryd.pidbox”
  • “celeryev.643a99be-74e8-44e1-8c67-fdd9891a5326”
  • “celeryev.f7a1d511-448b-42ad-9e51-52baee60e977”
  • “_kombu.binding.celeryev”
  • “celeryev.d4bd2c8d-57ea-4058-8597-e48f874698ca”
  • `_kombu.binding.celery”
  • celeryev.643a99be-74e8-44e1-8c67-fdd9891a5326充满了以下消息:
    {"sw_sys": "Linux", "clock": 1, "timestamp": 1325914922.206671, "hostname": "064d9ffe-94a3-4a4e-b0c2-be9a85880c74", "type": "worker-online", "sw_ident": "celeryd", "sw_ver": "2.4.5"}
    

    您知道我可以做些什么来定期清除这些消息吗?

    最佳答案

    这是解决方案吗?

    除了_kombu.bindings.celeryev设置的

  • 外,例如celeryev.i-am-alive。具有TTL设置的键(例如30秒);
  • celeryev进程将自身添加到绑定(bind)中,并定期(例如,每5秒一次)更新celeryev.i-am-alive。重置TTL的键;
  • 在发送事件工作进程之前,
  • 不仅检查_kombu.bindings.celeryev上的成员,还检查单个celeryev.i-am-alive。 key 也是如此,如果未找到(过期) key ,则会将其从_kombu.bindings.celeryev中删除(可能会执行del celeryev。或expire celeryev命令)。

  • 我们不能只使用keys命令,因为它是O(N),其中N是DB中的键总数。 TTL在
    到期celeryev。而不是del celeryev。可以使用它来使临时的celeryev离线消费者恢复活力,但我不知道这是否值得。

    author

    关于django - celery 和Redis继续用尽内存,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8784282/

    10-12 18:13