如何用Celery在节点之间均匀分配任务?
我使用 Celery 和 Django 来管理任务队列,并使用一个(或多个)小型(单核)EC2 实例来处理该任务。
我有一些考虑。
- 我的任务在单个核心上占用 100% 的 CPU。 - 使用任何可用的 CPU,但仅在一个核心中
- 如果有 2 个任务在同一核心上进行,则每个任务的速度将减半。
- 我想尽快开始每项任务,而不是让它被搁置。
现在假设我有 4 个 EC2 实例,我用 "-c 5" 启动 celery 。即每个实例 5 个并发任务。
在此设置中,如果我有 4 个新任务,我想确保每个任务都进入不同的实例,而不是 4 个进入同一实例并且每个任务争夺 CPU。
同样,如果我有 8 个任务,我希望每个实例一次获取 2 个任务,而不是 2 个实例分别处理 4 个任务。
芹菜已经像我描述的那样了吗?如果不是那么我怎样才能让它表现得像这样呢?
I am using Celery with Django to manage a task que and using one (or more) small(single core) EC2 instances to process the task.
I have some considerations.
- My task eats 100% CPU on a single core. - uses whatever CPU available but only in one core
- If 2 tasks are in progress on the same core, each task will be slowed down by half.
- I would like to start each task ASAP and not let it be que.
Now say I have 4 EC2 instances, i start celery with "-c 5" . i.e. 5 concurrent tasks per instance.
In this setup, if I have 4 new tasks, id like to ensure, each of them goes to different instance, rather than 4 going to same instance and each task fighting for CPU.
Similarly, if I have 8 tasks, id like each instance to get 2 tasks at a time, rather than 2 instances processing 4 tasks each.
Does celery already behave the way I described? If not then how can i make it behave as such?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
实际上很简单:每个 ec2 实例启动一个 celery 实例。将并发设置为每个 ec2 实例的核心数。
现在,任务不会干扰并在实例之间很好地分配。
(上面假设你的任务是CPU密集型的)
it's actually easy: you start one celery-instance per ec2-instance. set concurrency to the number of cores per ec2-instance.
now the tasks don't interfere and distribute nicely among you instances.
(the above assumes that your tasks are cpu bound)