为了在科学实验中比较和对比三种不同算法的性能,我计划使用Celery调度程序。这些算法由三种不同的工具实现。他们可能已实现并行化,也可能未实现并行化,因此我不想事先做任何假设。数据集包含1万个数据点。所有这三个工具都应在所有数据点上运行;转换为调度程序调度的3万个任务。我想要的是在所有执行中为所有工具分配相同数量的资源。
假设我的物理Ubuntu 18.04服务器配备了24个内核和96 GB的RAM。任务由4位Celery工作人员安排,每个工作人员处理一个任务。我想为每个任务设置4个CPU内核和16 GB内存的上限。此外,任何两个任务都不应争夺相同的内核,即4个任务总共应使用16个内核,每个任务都安排在自己的一组内核上。
是否有任何方法通过Celery或cgroup或任何其他机制来完成此设置?我想避免使用docker,kubernetes或任何基于VM的方法,除非绝对必要。
最佳答案
通过将并发数指定为6,处理CPU内核应该相当容易。但是限制内存使用量是要求的难部分,我相信您可以通过使工作进程由指定内存限制的特定cgroup拥有来实现这一点。
另一种选择是在指定限制的容器中运行 celery worker 。
我不愿这样做,因为可能有一些任务(或带有特定参数的任务)分配了少量的RAM,因此,如果在此类任务运行时无法使用4G RAM,那将很浪费。
不推荐使用Pity Celery自动缩放功能(这是Celery IMHO最酷的功能之一)。实现Celery自动缩放器可以根据内存利用率进行向上/向下缩放,这不是一个艰巨的任务。
关于docker - 如何为在Celery群集上部署的所有任务分配相同数量的资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62048054/