Celery和Redis的内存不足

时间:2012-01-09 05:29:29

标签: django redis celery celeryd celerybeat

我有一个部署到Heroku的Django应用程序,其中一个工作进程运行芹菜(+ 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'*'的输出:

  1. “_ kombu.binding.celeryd.pidbox”
  2. “celeryev.643a99be-74e8-44e1-8c67-fdd9891a5326”
  3. “celeryev.f7a1d511-448b-42ad-9e51-52baee60e977”
  4. “_ kombu.binding.celeryev”
  5. “celeryev.d4bd2c8d-57ea-4058-8597-e48f874698ca”
  6. `_kombu.binding.celery“
  7. 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"}
    

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

1 个答案:

答案 0 :(得分:1)

这是一个解决方案吗?

  1. 除了_kombu.bindings.celeryev之外,还会有例如celeryev.i-AM-活着。 TTL设置的密钥(例如30秒);
  2. celeryev进程将自己添加到绑定中并定期(例如每5秒)更新celeryev.i-am-alive。重置TTL的关键;
  3. 在发送事件工作者进程之前,检查不仅会查看_kombu.bindings.celeryev,而且会查看个人celeryev.i-am-alive。密钥以及如果找不到密钥(已过期),那么它将从_kombu.bindings.celeryev中删除(可能还会执行del celeryev。或expire celeryev。命令)。
  4. 我们不能只使用keys命令,因为它是O(N),其中N是DB中键的总数。在redis上TTL可能很棘手< 2.1虽然。

    到期celeryev。而不是del celeryev。可以用来让临时离线的celeryev消费者复活,但我不知道它是否值得。

    author