

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

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

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

动态节点的扩展分为两个步骤，包括启动 EC2 实例和将启动的 Amazon EC2 实例分配给Slurm节点。这两个步骤中的每一步都可以使用**全有或全无**或**最大努力**逻辑来完成。

启动 Amazon EC2 实例：
+ **全有或全无**调用启动 Amazon EC2 API，最小目标值等于总目标容量
+ **最大努力**调用启动 Amazon EC2 API，最小目标值等于 1，总目标容量等于请求的容量

将 Amazon EC2 实例分配到 Slurm 节点：
+ 只有当有可能为每个请求的节点分配一个 Amazon EC2 实例时，**全有或全无**才会为 Slurm 节点分配 Amazon EC2 实例
+ 即使 Amazon EC2 实例容量无法覆盖所有请求节点，**最大努力**也会将 Amazon EC2 实例分配给 Slurm 节点

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

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

**全有或全无**扩展：

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

该策略采用**全有或全无**逻辑为每个作业启动 Amazon EC2 实例，并采用**全有或全无**逻辑将 Amazon EC2 实例分配给 Slurm 节点。

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

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

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

**贪婪算法全有或全无**扩展：

这种全有要么全有或全无策略的变体仍可确保集群仅在每个任务所需的容量可用时才进行扩展，从而避免在扩展过程结束时出现空闲实例，但它涉及 ParallelCluster 启动旨在将最低目标容量设置为 1 的 Amazon EC2 启动实例 API 调用，尝试将启动的节点数量最大化到请求的容量。该策略采用“最大努力”逻辑为所有作业启动 EC2 实例，并为每个作业采用**全有或全无**逻辑来将 Amazon EC2 实例分配给 Slurm 节点。

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

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

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

**最大努力**扩展：

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

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

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

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

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

**全有或全无**扩展：
+ 对于第一个作业，调用**全有或全无** Amazon EC2 启动实例 API，请求 20 个实例。一次成功的调用启动了 20 个实例
+ 在第一个作业中，采用**全有或全无**将 20 个已启动的实例分配给 Slurm 节点是成功的
+ 对于第二个作业，采用**全有或全无**再次调用 Amazon EC2 启动实例 API，请求 20 个实例。调用不成功，因为只有另外 10 个实例的容量。目前未启动任何实例

**贪婪算法全有或全无**扩展：
+ 采用**最大努力**调用 Amazon EC2 启动实例 API，请求 40 个实例，这是所有作业请求的总容量。这会导致启动 30 个实例
+ 在第一个作业中，采用**全有或全无**将 20 个已启动的实例分配给 Slurm 节点是成功的
+ 对于第二个作业，再次采用**全有或全无**尝试将剩余的已启动实例分配给 Slurm 节点，但由于作业总共请求 20 个实例而只有 10 个实例可用，因此分配不成功
+ 10 个未分配的已启动实例被终止

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