为了在科学实验中比较三种不同算法的性能,我打算使用Celery调度器。这些算法是由三个不同的工具实现的。它们可能有也可能没有实现并行性,我不想事先做任何假设。数据集包含10K个数据点。所有的三个工具都应该在所有的数据点上运行;这相当于由调度器调度了30K个任务。我所希望的是,在所有的执行过程中,为所有的工具分配相同数量的资源。
假设,我的物理Ubuntu 18.04服务器配备了24个内核和96 GB的内存。任务由4个Celery worker调度,每个人处理一个任务。我想把每个任务的CPU核数上限定为4个,内存为16GB。而且,不能让两个任务争夺同一个核心,也就是说,4个任务总共要使用16个核心,每个任务都安排在自己的一组核心上。
有没有什么方法可以实现这样的设置,可以通过Celery,或者cgroup,或者通过其他机制?我想避免使用docker,kubernetes,或者任何基于虚拟机的方法,除非绝对需要。
通过将并发量指定为6,处理CPU核应该是相当容易的。但是限制内存使用是很难的部分,我相信你可以通过让worker进程由你指定内存限制的特定cgroup拥有来实现。
另一种方法是在有指定限制的容器中运行Celery Worker。
我不喜欢这样做,因为可能有一些任务(或有特定参数的任务)需要分配极少的内存,所以如果你不能在这样的任务运行时使用4G的内存,那就太浪费了。
遗憾的是Celery的自动缩放功能被废弃了(这是Celery最酷的功能之一,我认为)。要实现Celery自动缩放器,根据内存利用率来进行升级,应该不是一件难事。