如何在服务器上并行提交“任务”

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 个用户在服务器上运行,我如何知道有多少进程正在运行以及有多少插槽可用。对于服务器的单个用户来说,这似乎是一个很棒的工具,但是如果所有用户独立使用所有线程,我们将导致服务器崩溃。我是否误解了某些情况,即我们在同一台服务器上有多个用户希望同时使用所有资源? 更新了答案。 非常感谢这篇精彩的总结。我会看看你建议的所有工具。

以上是关于如何在服务器上并行提交“任务”的主要内容,如果未能解决你的问题,请参考以下文章

FLINK安装及提交任务

合并不同 SVN 服务器上的并行提交

如何在 Azure ML 服务计算集群上并行工作?

如何从 SLURM 中的节点列表向任何 [子集] 节点提交作业?

如何在基于 C# 的 Windows 服务中处理以不同时间间隔并行运行的多个任务?

Apache Airflow:在单个 DAG 运行中运行所有并行任务