celery - 关于 celery 可扩展性的查询

标签 celery

关于 celery 我有几个问题。请帮助我。

  1. 我们是否需要将项目代码放入每个 celery worker 中?如果是,如果我正在增加工作人员的数量并且我正在更新我的代码,那么更新所有工作人员实例中的代码的最佳方法是什么(无需每次都手动将代码推送到每个实例)?

    <
  2. 在 celery worker 中使用 -Ofair 作为参数禁用 worker 中的预取,即使设置了 PREFETCH_LIMIT=8 左右

  3. 重要提示:rabbitmq broker 是将任务分配给 workers 还是 workers 从 broker 拉取任务?

  4. 在一个系统中拥有多个 celery worker(具有与核心数量一样多的子进程)是否有意义?我看到很少有人在一个系统中运行多个 celery worker。

  5. 补充上一个问题,两种场景的性能差异是什么:系统中的单个工作器(8 核)或两个工作器(并发 4)

请回答我的问题。提前致谢。

最佳答案

Do we need to put the project code in every celery worker? If yes, if I am increasing the number of workers and also I am updating my code, what is the best way to update the code in all the worker instances (without manually pushing code to every instance everytime)?

是的。 celery worker 运行你的代码,因此它自然需要访问该代码。如何使代码易于访问完全取决于您。一些方法包括:

  • 作为部署的一部分,工作人员的代码更新和重启

    如果您在 kubernetes pod 中运行您的 celery worker,这归结为构建一个新的 docker 镜像并将您的 worker 升级到新镜像。 Using rolling updates这可以在零停机的情况下完成。

  • 从存储库和 worker 的计划同步通过广播重新启动

    如果您在更传统的环境中运行您的 celery worker,或者出于某种原因您不想重建整个图像,您可以使用一些所有 worker 都可用的中央文件系统,您可以在其中更新文件,例如按计划或通过某些触发器同步 git 存储库。重启所有 celery worker 很重要,这样他们才能重新加载代码。这可以通过 remote control 来完成.

  • 为每个任务动态加载代码

    例如 omega|ml我们提供 lambda 风格的无服务器执行 动态加载到工作进程中的任意 python 脚本。 为避免模块加载和依赖性问题,保持 max-tasks-per-child=1 并使用 prefork 池很重要。虽然这增加了一些开销,但我们发现这是一种易于管理的权衡(特别是我们运行机器学习任务,因此在每个任务后加载脚本和重新启动 worker 的小开销不是问题)

Using -Ofair in celery worker as argument disable prefetching in workers even if have set PREFETCH_LIMIT=8 or so?

-O fair 阻止工作人员预取任务,除非有空闲进程。但是有一个 quirk with rate limits我最近偶然发现了。在实践中,我没有遇到预取和速率限制的问题,但是对于任何分布式系统来说,考虑执行的异步性质的影响是值得的(这不是 Celery 特有的,而是适用于所有此类系统) .

IMPORTANT: Does rabbitmq broker assign the task to the workers or do workers pull the task from the broker?

Rabbitmq 不知道 worker(也不知道 celery 支持的任何其他代理)——它们只是维护一个消息队列。也就是说,是 worker 从 broker 那里拉取任务。

与此相关的一个问题是如果我的工作人员在执行任务时崩溃了怎么办。这有几个方面: workerworker 进程 之间存在区别。 worker 是从 broker 开始消费任务的单个任务,它不执行任何任务代码。任务代码由其中一个工作进程执行。当使用 prefork 池(默认设置)时,失败的工作进程会简单地重新启动,而不会影响整个工作进程或其他工作进程。

Does it make sense to have more than one celery worker (with as many subprocesses as number of cores) in a system? I see few people run multiple celery workers in a single system.

这取决于您需要运行的工作负载的规模和类型。一般来说,CPU 绑定(bind)任务应该在并发设置不超过内核数的工作线程上运行。如果您需要处理的这些任务多于您拥有的核心,请运行多个工作线程以进行横向扩展。请注意,如果您的 CPU 密集型任务一次使用多个内核(例如机器学习工作负载/数字处理中经常出现的情况),则它是每个任务使用的内核总数,而不是同时运行的任务总数告知您的决定。

To add to the previous question, whats the performance difference between the two scenarios: single worker (8 cores) in a system or two workers (with concurrency 4)

一般很难说,最好运行一些测试。例如,如果 4 个并发运行的任务使用了单个节点上的所有内存,则添加另一个 worker 将无济于事。但是,如果您有两个队列,例如具有不同的到达率(比如一个用于低频率但高优先级执行,另一个用于高频但低优先级)两者都可以在同一个节点上同时运行而不用担心 CPU 或内存,单个节点就可以了。

关于celery - 关于 celery 可扩展性的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56681692/

相关文章:

django - Celery beat 进程在启动时分配大量内存

django - 如何使用 Django admin 使用 Celery 创建自定义任务

python - Django 应用程序的典型内存使用情况

python - Celeryd 忽略/etc/default/celeryd 中的 BROKER_URL

django - 当根记录器配置为使用 raven 时,Celery 定期任务不会运行

python - celery 即使允许也不会接受 pickle

django - Celery 实时监控和 Django 应用

python - 查看 celery 任务是否存在

python - 为什么它找不到我的 celery 配置文件?

python - Celery - 链接远程回调