

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 版本 3.8.0 中的 Slurm 动态节点分配策略
<a name="scheduler-node-allocation-v3-3.8.0"></a>

从 ParallelCluster 版本 3.8.0 开始， ParallelCluster 使用**作业级恢复**或**作业级扩展**作为默认的动态节点分配策略来扩展集群： ParallelCluster 根据每个作业的要求、分配给任务的节点数量以及需要恢复的节点数量来扩展集群。 ParallelCluster 从 SLURM\$1RESUME\$1FILE 环境变量中获取此信息。

动态节点的扩展分为两个步骤，包括启动 EC2 实例和将启动的 Amazon EC2 实例分配到 Slurm 节点。这两个步骤中的每一个都可以使用**all-or-nothing**或**尽力**而为的逻辑来完成。

启动 Amazon EC2 实例：
+ **all-or-nothing**调用启动的 Amazon EC2 API，其最小目标等于总目标容量
+ **最大努力**调用启动 Amazon EC2 API，最小目标值等于 1，总目标容量等于请求的容量

将 Amazon EC2 实例分配到 Slurm 节点：
+ **all-or-nothing**只有在可以为每个请求的Slurm节点分配一个 Amazon EC2 实例的情况下，才会将 Amazon EC2 实例分配给节点
+ 即使 Amazon EC2 实例容量无法覆盖所有请求节点，**最大努力**也会将 Amazon EC2 实例分配给 Slurm 节点

  上述策略的可能组合转化为 ParallelCluster发射策略。

**Example**  [ ScalingStrategy](Scheduling-v3.md#yaml-Scheduling-ScalingStrategy)

**all-or-nothing**缩放：

此策略包括 AWS ParallelCluster 为每个任务启动 Amazon EC2 启动实例 API 调用，这要求成功启动所请求的计算节点所需的所有实例。这可确保集群只在每个作业所需的容量可用时才进行扩展，避免在扩展过程结束时留下闲置实例。

该策略使用一种**all-or-nothing**逻辑来启动每项任务的 Amazon EC2 实例，以及将 Amazon EC2 实例分配给Slurm节点的**all-or-nothing**逻辑。

该策略将启动请求分为若干批次，每个请求的计算资源一个批次，每个批次最多 500 个节点。对于跨越多个计算资源或超过 500 个节点的请求， ParallelCluster 按顺序处理多个批次。

任何单一资源的批处理失败都会导致所有相关未使用容量的终止，从而确保在扩展过程结束时不会留下任何闲置实例。

限制
+ 扩展所需的时间与每次执行 Slurm 恢复程序时提交的作业数量成正比。
+ 扩展操作受 RunInstances 资源账户限制的限制，默认情况下设置为 1000 个实例。此限制符合 AWS EC2 API 限制政策，有关更多详细信息，请参阅 [Amazon EC2 API](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/throttling.html) 限制文档 
+ 当您在具有单一实例类型的计算资源中提交任务时，在跨越多个可用区的队列中，只有在单个可用区中可以提供所有容量时，**all-or-nothing**EC2 启动 API 调用才会成功。
+ 当您在具有多种实例类型的计算资源中提交任务时，在具有单个可用区的队列中，只有当所有容量均可由单个实例类型提供时，**all-or-nothing**Amazon EC2 启动 API 调用才会成功。
+ 当您在具有多种实例类型的计算资源中提交任务时，在跨越多个可用区的队列中，不支持 **all-or-nothing**Amazon EC2 启动 API 调用，而是 ParallelCluster 执行**尽力**扩展。

**greedy-all-or-nothing**缩放：

该 all-or-nothing策略的这种变体仍然可以确保集群仅在每个任务所需的容量可用时才进行扩展，从而避免在扩展过程结束时出现空闲实例，但它涉及 ParallelCluster 启动一个目标最小容量为 1 的 Amazon EC2 启动实例 API 调用，尝试将启动的节点数量最大化到请求的容量。该策略使用尽力为所有任务启动 EC2 实例的逻**all-or-nothing**辑，以及将 Amazon EC2 实例分配给每个任务的Slurm节点的逻辑。

该策略将启动请求分为若干批次，每个请求的计算资源一个批次，每个批次最多 500 个节点。对于跨越多个计算资源或超过 500 个节点的请求， ParellelCluster 按顺序处理多个批次。

该策略以在扩展过程中暂时过度扩展为代价，最大限度地提高吞吐量，从而确保在扩展过程结束时不会留下闲置实例。

限制
+ 可能会出现临时的过度扩展，导致在扩展完成前过渡到运行状态的实例产生额外费用。
+ 与 all-or-nothing策略中相同的实例限制适用，具体取决于 AWS的 RunInstances 资源账户限制。

**最大努力**扩展：

该策略调用 Amazon EC2 启动实例 API 调用，将最小容量设为 1，并以达到总请求容量为目标，但如果不是所有要求的容量都可用，则在扩展过程执行后会留下闲置实例。该策略采用“最大努力”逻辑为所有作业启动 Amazon EC2 实例，并为每个作业采用**最大努力**逻辑来将 Amazon EC2 实例分配给 Slurm 节点。

该策略将启动请求分为若干批次，每个请求的计算资源一个批次，每个批次最多 500 个节点。对于跨越多个计算资源或超过 500 个节点的请求， ParallelCluster 按顺序处理多个批次。

这种策略允许在多次扩展过程执行中，扩展的实例数量远远超过默认的 1000 个实例限制，但代价是在不同扩展进程中出现闲置实例。

限制
+ 在扩展过程结束时可能出现的闲置运行实例，用于无法分配作业要求的所有节点的情况。

以下示例显示了使用不同的**ParallelCluster 启动策略**扩展动态节点的行为。假设您提交了两个作业，每个作业需要 20 个节点，总共需要 40 个相同类型的节点，但只有 30 个 Amazon EC2 实例可用，无法满足 EC2 上的请求容量。

**all-or-nothing**缩放：
+ 对于第一项任务，调用了 A ** all-or-nothing**mazon EC2 启动实例 API，请求了 20 个实例。一次成功的调用启动了 20 个实例
+ **all-or-nothing **成功将 20 个已启动的实例分配给第一个任务的Slurm节点
+ 调用了另一个 **all-or-nothing**Amazon EC2 启动实例 API，为第二个任务请求 20 个实例。调用不成功，因为只有另外 10 个实例的容量。目前未启动任何实例

**greedy-all-or-nothing**缩放：
+ 采用**最大努力**调用 Amazon EC2 启动实例 API，请求 40 个实例，这是所有作业请求的总容量。这会导致启动 30 个实例
+ 成功将 20 个已启动的实例**all-or-nothing**分配给第一个任务的Slurm节点
+ 尝试将剩余已启动的实例再次**all-or-nothing**分配给第二个任务的Slurm节点，但是由于任务请求的总共 20 个实例中只有 10 个可用实例，因此分配不成功
+ 10 个未分配的已启动实例被终止

**最大努力**扩展：
+ 采用**最大努力**调用 Amazon EC2 启动实例 API，请求 40 个实例，这是所有作业请求的总容量。这会导致启动 30 个实例。
+ 在第一个作业中，采用**最大努力**将 20 个已启动的实例分配给 Slurm 节点是成功的。
+ 在第二个作业中，再次采用**最大努力**将剩余 10 个已启动的实例分配给 Slurm 节点是成功的，即使请求的总容量为 20 也是如此。但是，由于该作业请求 20 个节点，而 Amazon EC2 实例只能分配给其中的 10 个节点，因此该作业无法启动，实例处于闲置状态，直到在以后的扩展过程调用中找到足够的容量来启动缺少的 10 个实例，或者调度器将该作业调度到其它已经运行的计算节点上。