如何在服务器上并行提交“任务”
Posted
技术标签:
【中文标题】如何在服务器上并行提交“任务”【英文标题】:How to submit "tasks" in paralell on a server 【发布时间】:2017-01-06 10:00:15 【问题描述】:祝大家新年快乐,2017 年编码愉快。
我有 1M 的“任务”要使用 python 运行。每个任务大约需要 2 分钟,并且会处理一些本地图像。我想以自动方式尽可能多地并行运行。我的服务器有 40 个内核,所以我开始了解如何进行多处理,但我发现以下问题:
-
保存每个任务的日志并不容易(我正在努力,但到目前为止我没有成功,即使我在 *** 上找到了很多示例)
我如何知道我应该使用多少 CPU 以及应该将多少 CPU 留给服务器用于基本的服务器任务?
当我们在服务器上有多个用户时,如何查看已经使用了多少 CPU?
在我之前在 CERN 担任物理学家时,我们使用作业提交系统在许多集群上提交任务。当插槽可用时,任务被放入队列并处理。我们是否也有这样的 LINUX 服务器工具?我不知道这种工具的正确英文名称是什么(作业调度员?)。
最好的工具是我们可以配置为使用我们的 N CPU 作为“车辆”来处理并行任务(并保留所需的 CPU 以便服务器也可以运行基本任务),把工作队列中的所有用户都有优先级并处理它们“车辆”可用。奖励将是一种监控任务处理的方式。
我希望我用正确的词来描述我想要的东西。
谢谢 法比恩
【问题讨论】:
【参考方案1】:您所说的通常称为“工人池”。它可以使用线程或进程来实现。实施选择取决于您的工作流程。
工人池允许您选择要使用的工人数量。此外,池通常在工作人员前面有一个队列,以将它们与您的主逻辑分离。
如果您想在单个服务器中运行任务,则可以使用multiprocessing.Pool 或concurrent.futures.Executor。
如果您想在集群上分配任务,有几种解决方案。 Celery 和 Luigi 就是很好的例子。
编辑:
这不是您作为用户关心的问题。现代操作系统在多个用户之间共享资源方面做得很好。如果过度使用资源成为问题,系统管理员应通过为每个用户分配配额来确保不会发生这种情况。这可以通过多种方式完成。系统管理员应该熟悉的示例工具是ulimit。
换句话说:你的软件不应该做操作系统的用途:抽象底层机器为你的软件提供“无限”的资源集。管理服务器的人应该告诉你:“最多使用 X 个 CPU”。
您在 CERN 使用的可能是像 Mesos 这样的系统。这些解决方案将大型集群聚合在一组资源中,您可以根据这些资源安排任务。如果所有用户都通过它访问集群,则此方法有效。
如果您与其他人共享服务器,则要么就配额达成一致,要么都采用通用调度框架,例如 Celery。
【讨论】:
谢谢。我正在使用 python 多处理模块,但我不清楚我们是否有 3 个用户在服务器上运行,我如何知道有多少进程正在运行以及有多少插槽可用。对于服务器的单个用户来说,这似乎是一个很棒的工具,但是如果所有用户独立使用所有线程,我们将导致服务器崩溃。我是否误解了某些情况,即我们在同一台服务器上有多个用户希望同时使用所有资源? 更新了答案。 非常感谢这篇精彩的总结。我会看看你建议的所有工具。以上是关于如何在服务器上并行提交“任务”的主要内容,如果未能解决你的问题,请参考以下文章
如何从 SLURM 中的节点列表向任何 [子集] 节点提交作业?