【问题标题】:How to submit "tasks" in paralell on a server如何在服务器上并行提交“任务”
【发布时间】:2017-01-06 10:00:15
【问题描述】:

祝大家新年快乐,2017 年编码愉快。

我有 1M 的“任务”要使用 python 运行。每个任务大约需要 2 分钟,并且会处理一些本地图像。我想以自动方式尽可能多地并行运行。我的服务器有 40 个内核,所以我开始了解如何进行多处理,但我发现以下问题:

  1. 保存每个任务的日志并不容易(我正在努力,但到目前为止我没有成功,即使我在 stackoverflow 上找到了很多示例)
  2. 我如何知道我应该使用多少 CPU 以及应该将多少 CPU 留给服务器用于基本的服务器任务?
  3. 当我们在服务器上有多个用户时,如何查看已经使用了多少 CPU?

在我之前在 CERN 担任物理学家时,我们使用作业提交系统在许多集群上提交任务。当插槽可用时,任务被放入队列并处理。我们是否也有这样的 LINUX 服务器工具?我不知道这种工具的正确英文名称是什么(作业调度员?)。

最好的工具是我们可以配置为使用我们的 N CPU 作为“车辆”来处理并行任务(并保留所需的 CPU 以便服务器也可以运行基本任务),把工作队列中的所有用户都有优先级并处理它们“车辆”可用。奖励将是一种监控任务处理的方式。

我希望我用正确的词来描述我想要的东西。

谢谢 法比恩

【问题讨论】:

    标签: server multiprocessing jobs submission


    【解决方案1】:

    您所说的通常称为“工人池”。它可以使用线程或进程来实现。实施选择取决于您的工作流程。

    工人池允许您选择要使用的工人数量。此外,池通常在工作人员前面有一个队列,以将它们与您的主逻辑分离。

    如果您想在单个服务器中运行任务,则可以使用multiprocessing.Poolconcurrent.futures.Executor

    如果您想在集群上分配任务,有几种解决方案。 CeleryLuigi 就是很好的例子。

    编辑:

    这不是您作为用户关心的问题。现代操作系统在多个用户之间共享资源方面做得很好。如果过度使用资源成为问题,系统管理员应通过为每个用户分配配额来确保不会发生这种情况。这可以通过多种方式完成。系统管理员应该熟悉的示例工具是ulimit

    换句话说:你的软件不应该做操作系统的用途:抽象底层机器为你的软件提供“无限”的资源集。管理服务器的人应该告诉你:“最多使用 X 个 CPU”。

    您在 CERN 使用的可能是像 Mesos 这样的系统。这些解决方案将大型集群聚合在一组资源中,您可以根据这些资源安排任务。如果所有用户都通过它访问集群,则此方法有效。

    如果您与其他人共享服务器,则要么就配额达成一致,要么都采用通用调度框架,例如 Celery。

    【讨论】:

    • 谢谢。我正在使用 python 多处理模块,但我不清楚我们是否有 3 个用户在服务器上运行,我如何知道有多少进程正在运行以及有多少插槽可用。对于服务器的单个用户来说,这似乎是一个很棒的工具,但是如果所有用户独立使用所有线程,我们将导致服务器崩溃。我是否误解了某些情况,即我们在同一台服务器上有多个用户希望同时使用所有资源?
    • 更新了答案。
    • 非常感谢这篇精彩的总结。我会看看你建议的所有工具。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-23
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多