django - Celery 和 Redis 不断耗尽内存

标签 django redis celery celeryd celerybeat

我有一个部署到 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 '*' 的输出:

  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"

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. 除了 _kombu.bindings.celeryev 集之外,还有例如celeryev.i-还活着。设置了 TTL 的键(例如 30 秒);
  2. celeryev 进程将自身添加到绑定(bind)中并定期(例如每 5 秒)更新 celeryev.i-am-alive。重置 TTL 的关键;
  3. 在发送事件工作进程之前,不仅要检查 _kombu.bindings.celeryev 上的成员,还要检查个人 celeryev.i-am-alive。 key 也是如此,如果未找到 key (已过期),则会将其从 _kombu.bindings.celeryev 中删除(可能还会执行 del celeryev. 或 expire celeryev. 命令)。

我们不能只使用 keys 命令,因为它是 O(N),其中 N 是数据库中键的总数。不过,TTL 在 Redis < 2.1 上可能会很棘手。

让 celeryev 过期。而不是德尔切列耶夫。可以用来让临时离线的celeryev消费者复活,但我不知道是否值得。

author

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

相关文章:

Perl redis hset 没有返回正确的 retcode?

python - 如何使用 docker-compose 设置一个容器以允许其整个卷访问另一个容器

python - Django |调用的方法不起作用

mysql - 是否可以在 Azure 网站上创建使用数据库的 Django 应用程序?

python - 我做错了什么? Django 对象过滤器

python-3.x - 从 Celery Scheduler 检索已执行的任务?

mysql - 在 django admin 中修改条目会创建重复项

performance - 从 Redis SETS 获取数据是否比 HSETS 更快或更高效?

django - 如何在Windows机器上用django测试 celery

python - Celery:如何创 build 置文件?