如何在服务器上并行提交 "tasks"

How to submit "tasks" in paralell on a server

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

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

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

我以前在 CERN 担任物理学家时,我们使用作业提交系统在许多集群上提交任务。任务被放入队列中,并在有空位时进行处理。 LINUX 服务器也有这样的工具吗?我不知道这种工具的正确英文名称是什么 (job dispatcher ?)。

最好是一个工具,我们可以将其配置为使用我们的 N CPU 作为 "vehicle" 来处理并行任务(并保留所需的 CPU 以便服务器也可以 运行 基本任务),将所有用户的作业优先放入队列中并处理它们 "vehicle" 可用。奖金将是一种监控任务处理的方式。

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

谢谢 法比安

你说的一般是指"Pool of Workers"。它可以使用线程或进程来实现。实施选择取决于您的工作流程。

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

如果你想在单个服务器中 运行 任务,那么你可以使用 multiprocessing.Pool or concurrent.futures.Executor.

如果你想在集群上分配任务,有几种解决方案。 Celery and Luigi 是很好的例子。

编辑:

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

换句话说:您的软件不应该做操作系统的用途:抽象底层机器以为您的软件提供一组 "limitless" 资源。管理服务器的人应该是告诉你的人:"use at most X CPUs".

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

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