

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

# 集群容量大小和更新
<a name="slurm-cluster-capacity-size-and-update"></a>

集群的容量由集群可以扩展的计算节点数量来定义。计算节点由 AWS ParallelCluster 配置中的计算资源中定义的 Amazon EC2 实例提供支持`(Scheduling/SlurmQueues/ ComputeResources)`，并按照 1:1 映射到`(Scheduling/SlurmQueues)`的队列进行组织 Slurm 分区。

在计算资源中，可以配置集群中必须始终保持运行的计算节点（实例）的最小数量（`MinCount`），以及计算资源可扩展到的实例最大数量（[`MaxCount`3 ](Scheduling-v3.md#yaml-Scheduling-SlurmQueues-ComputeResources-MaxCount)）。

在创建集群时或群集更新时，为集群中定义的每个计算资源 (`Scheduling/SlurmQueues/ ComputeResources`) AWS ParallelCluster 启动中配置`MinCount`的任意数量的 Amazon EC2 实例。为覆盖集群中计算资源的最小节点数量而启动的实例称为***静态节点***。静态节点一旦启动，就会在集群中持续存在，除非发生特定事件或情况，否则系统不会终止它们。例如，此类事件包括失败 Slurm 或者 Amazon EC2 健康检查和变更 Slurm 节点状态变为 “耗尽” 或 “关闭”。

为应对集群`MaxCount `*负载增加而`1`按需启动的 Amazon EC2 实例被称为***动态节点***，范围为`‘MaxCount - MinCount’`（减去*` MinCount)`）。 它们的性质是短暂的，启动它们是为了处理待处理的任务，如果它们`Scheduling/SlurmSettings/ScaledownIdletime`在集群配置中定义的一段时间内保持闲置状态（默认值：10 分钟），它们就会被终止。

静态节点和动态节点符合以下命名方案：
+ 静态节点 `<Queue/Name>-st-<ComputeResource/Name>-<num>`，其中 `<num> = 1..ComputeResource/MinCount`
+ 动态节点 `<Queue/Name>-dy-<ComputeResource/Name>-<num>`，其中 `<num> = 1..(ComputeResource/MaxCount - ComputeResource/MinCount)`

例如，给定以下 AWS ParallelCluster 配置：

```
Scheduling:  
    Scheduler: Slurm  
    SlurmQueues:    
        - Name: queue1      
            ComputeResources:        
                - Name: c5xlarge          
                    Instances:            
                        - InstanceType: c5.xlarge          
                        MinCount: 100          
                        MaxCount: 150
```

将在中定义以下节点 Slurm

```
$ sinfo
PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
queue1*      up   infinite     50  idle~ queue1-dy-c5xlarge-[1-50]
queue1*      up   infinite    100   idle queue1-st-c5xlarge-[1-100]
```

当计算资源的 `MinCount == MaxCount` 时，所有相应的计算节点都将是静态的，所有实例都将在集群创建/更新时启动并保持运行。例如：

```
Scheduling:
  Scheduler: slurm
  SlurmQueues:
    - Name: queue1
      ComputeResources:
        - Name: c5xlarge
          Instances:
            - InstanceType: c5.xlarge
          MinCount: 100
          MaxCount: 100
```

```
$ sinfo
PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
queue1*      up   infinite    100   idle queue1-st-c5xlarge-[1-100]
```

## 集群容量更新
<a name="cluster-capacity-update-c2"></a>

集群容量的更新包括添加或删除队列、计算资源或更改计算资源的 `MinCount/MaxCount`。从 AWS ParallelCluster 版本 3.9.0 开始，缩小队列大小需要在集群更新之前停止计算队列或将其[QueueUpdateStrategy](Scheduling-v3.md#yaml-Scheduling-SlurmSettings-QueueUpdateStrategy)设置为 TERMINATION for。在以下情况下，无需停止计算队列或将其设置[QueueUpdateStrategy](Scheduling-v3.md#yaml-Scheduling-SlurmSettings-QueueUpdateStrategy)为 “终止”：
+ 将新队列添加到 Scheduling/[`SlurmQueues`](Scheduling-v3.md#Scheduling-v3-SlurmQueues)

   
+ 向队列中添加新的计算资源 `Scheduling/SlurmQueues/ComputeResources`
+ 增加计算资源的 `MaxCount`
+ 计算资源的增加 MaxCount 和相同计算资源的增加量至少相等 MinCount 

## 注意事项和限制
<a name="cluster-considerations-limitations"></a>

本节旨在概述在调整集群容量大小时应考虑的任何重要因素、约束或限制。
+ 从`Scheduling/SlurmQueues`所有具有静态和动态名称`<Queue/Name>-*`的计算节点中移除队列时，将从 Slurm 配置和相应的 Amazon EC2 实例将被终止。
+ `Scheduling/SlurmQueues/ComputeResources`从队列中移除计算资源时，所有名`<Queue/Name>-*-<ComputeResource/Name>-*`为静态和动态的计算节点都将从队列中移除 Slurm 配置和相应的 Amazon EC2 实例将被终止。

在更改计算资源的 `MinCount` 参数时，我们可以区分两种不同的情况，一种是 `MaxCount` 与 `MinCount` 相等（仅静态容量），另一种是 `MaxCount` 大于 `MinCount`（静态和动态混合容量）。

### 只有静态节点的容量变化
<a name="capacity-changes-static-nodes"></a>
+ 如果在增加`MinCount`（和`MaxCount`）时`MinCount == MaxCount`，将通过将静态节点的数量扩展到新的值来配置集群，`MinCount``<Queue/Name>-st-<ComputeResource/Name>-<new_MinCount>`并且系统将继续尝试启动 Amazon EC2 实例以满足新的所需静态容量。
+ 如果在减少`MinCount`（和`MaxCount`）数量 N 时`MinCount == MaxCount`，将通过移除最后 N 个静态节点来配置集群，`<Queue/Name>-st-<ComputeResource/Name>-<old_MinCount - N>...<old_MinCount>]`并且系统将终止相应的 Amazon EC2 实例。
  + 初始状态 `MinCount = MaxCount = 100`
  + 

    ```
    $ sinfo
    PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
    queue1*      up   infinite    100   idle queue1-st-c5xlarge-[1-100]
    ```
  + 更新 `MinCount` 和 `MaxCount: MinCount = MaxCount = 70` 上的 `-30`
  + 

    ```
    $ sinfo
    PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
    queue1*      up   infinite     70   idle queue1-st-c5xlarge-[1-70]
    ```

### 混合节点的容量变化
<a name="mixed-node-capacity-changes"></a>

如果在增加`MinCount`数量 N（假设保持不变）时`MinCount < MaxCount`，`MaxCount`将通过将静态节点的数量扩展到新的值 `MinCount` (`old_MinCount + N`): 来配置集群，`<Queue/Name>-st-<ComputeResource/Name>-<old_MinCount + N>`并且系统将继续尝试启动 Amazon EC2 实例以满足新的所需静态容量。此外，为了满足计算资源的`MaxCount`容量，通过*删除最后 N 个动态节点*来更新集群配置：`<Queue/Name>-dy-<ComputeResource/Name>-[<MaxCount - old_MinCount - N>...<MaxCount - old_MinCount>]`系统将终止相应的 Amazon EC2 实例。
+ 初始状态：`MinCount = 100; MaxCount = 150`
+ 

  ```
  $ sinfo
  PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
  queue1*      up   infinite     50  idle~ queue1-dy-c5xlarge-[1-50]
  queue1*      up   infinite    100   idle queue1-st-c5xlarge-[1-100]
  ```
+ 将 \$130 更新为 `MinCount : MinCount = 130 (MaxCount = 150)`
+ 

  ```
  $ sinfo
  PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
  queue1*      up   infinite     20  idle~ queue1-dy-c5xlarge-[1-20]
  queue1*      up   infinite    130   idle queue1-st-c5xlarge-[1-130]
  ```

如果在增加`MinCount`且`MaxCount`数量相同 N 时`MinCount < MaxCount`，将通过将静态节点数扩展到新值 `MinCount` (`old_MinCount + N`): 来配置集群，`<Queue/Name>-st-<ComputeResource/Name>-<old_MinCount + N>`并且系统将继续尝试启动 Amazon EC2 实例以满足新的所需静态容量。此外，动态节点的数量不会因新的

 `MaxCount` 值。
+ 初始状态：`MinCount = 100; MaxCount = 150`
+ 

  ```
  $ sinfo
  PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
  queue1*      up   infinite     50  idle~ queue1-dy-c5xlarge-[1-50]
  queue1*      up   infinite    100   idle queue1-st-c5xlarge-[1-100]
  ```
+ 将 \$130 更新为 `MinCount : MinCount = 130 (MaxCount = 180)`
+ 

  ```
  $ sinfo
  PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
  queue1*      up   infinite     20  idle~ queue1-dy-c5xlarge-[1-50]
  queue1*      up   infinite    130   idle queue1-st-c5xlarge-[1-130]
  ```

如果`MinCount < MaxCount`在减少`MinCount`数量 N（假设保持不变）时，`MaxCount`将通过移除最后 N 个静态节点的静态节点来配置集群，系统将终止相应的 Amazon EC2 实例。`<Queue/Name>-st-<ComputeResource/Name>-[<old_MinCount - N>...<old_MinCount>`此外，为了满足计算资源的`MaxCount`容量，通过扩展动态节点的数量来更新集群配置以填补空白。`MaxCount - new_MinCount: <Queue/Name>-dy-<ComputeResource/Name>-[1..<MazCount - new_MinCount>]`在这种情况下，由于这些是动态节点，因此除非调度程序在新节点上有待处理的任务，否则不会启动新的 Amazon EC2 实例。
+ 初始状态：`MinCount = 100; MaxCount = 150`
+ 

  ```
  $ sinfo
  PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
  queue1*      up   infinite     50  idle~ queue1-dy-c5xlarge-[1-50]
  queue1*      up   infinite    100   idle queue1-st-c5xlarge-[1-100]
  ```
+ 更新 `MinCount : MinCount = 70 (MaxCount = 120)` 上的 -30
+ 

  ```
  $ sinfo
  PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
  queue1*      up   infinite     80  idle~ queue1-dy-c5xlarge-[1-80]
  queue1*      up   infinite     70   idle queue1-st-c5xlarge-[1-70]
  ```

如果在减少`MinCount`且`MaxCount`数量相同的 N 时`MinCount < MaxCount`，将通过移除最后 N 个静态节点`<Queue/Name>-st-<ComputeResource/Name>-<old_MinCount - N>...<oldMinCount>]`来配置集群，系统将终止相应的 Amazon EC2 实例。

 此外，动态节点的数量不会因新的 `MaxCount` 值而发生变化。
+ 初始状态：`MinCount = 100; MaxCount = 150`
+ 

  ```
  $ sinfo
  PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
  queue1*      up   infinite     50  idle~ queue1-dy-c5xlarge-[1-50]
  queue1*      up   infinite    100   idle queue1-st-c5xlarge-[1-100]
  ```
+ 更新 `MinCount : MinCount = 70 (MaxCount = 120)` 上的 -30
+ 

  ```
  $ sinfo
  PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
  queue1*      up   infinite     80  idle~ queue1-dy-c5xlarge-[1-50]
  queue1*      up   infinite     70   idle queue1-st-c5xlarge-[1-70]
  ```

如果在减少`MaxCount`数量 N（假设保持不变）时`MinCount < MaxCount`，`MinCount`将通过移除最后 N 个动态节点来配置集群，`<Queue/Name>-dy-<ComputeResource/Name>-<old_MaxCount - N...<oldMaxCount>]`并且系统将终止相应的 Amazon EC2 实例（如果它们正在运行）。预计不会对静态节点产生任何影响。
+ 初始状态：`MinCount = 100; MaxCount = 150`
+ 

  ```
  $ sinfo
  PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
  queue1*      up   infinite     50  idle~ queue1-dy-c5xlarge-[1-50]
  queue1*      up   infinite    100   idle queue1-st-c5xlarge-[1-100]
  ```
+ 更新 `MaxCount : MinCount = 100 (MaxCount = 120)` 上的 -30
+ 

  ```
  $ sinfo
  PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
  queue1*      up   infinite     20  idle~ queue1-dy-c5xlarge-[1-20]
  queue1*      up   infinite    100   idle queue1-st-c5xlarge-[1-100]
  ```

## 对作业的影响
<a name="job-impacts"></a>

在移除节点和 Amazon EC2 实例终止的所有情况下，除非没有其他节点满足任务要求，否则在已移除的节点上运行的 sbatch 作业都将重新排队。在最后一种情况下，任务失败，状态为 NODE\$1FAIL，并从队列中消失，必须手动重新提交。

如果您计划执行集群大小调整更新，可以防止作业在计划更新期间将被移除的节点上运行。这可以通过将要移除的节点设置为维护状态来实现。请注意，将节点设置为维护状态不会影响最终已在该节点上运行的作业。

假设在计划的集群大小调整更新中，您将移除节点 `qeueu-st-computeresource-[9-10`]。你可以创建一个 Slurm 使用以下命令进行预订

```
sudo -i scontrol create reservation ReservationName=maint_for_update user=root starttime=now duration=infinite flags=maint,ignore_jobs nodes=qeueu-st-computeresource-[9-10]
```

这将创建一个 Slurm 在节点`maint_for_update`上命名的预留`qeueu-st-computeresource-[9-10]`。从创建预留开始，`qeueu-st-computeresource-[9-10]` 节点上就不能再运行任何作业。请注意，预留不会阻止作业最终在 `qeueu-st-computeresource-[9-10]` 节点上分配。

集群大小更新后，如果 Slurm 仅在调整大小更新期间移除的节点上设置了预留，维护预留将自动删除。相反，如果你创建了一个 Slurm 在集群调整大小更新后仍然存在的节点上进行预留，我们可能需要在执行调整大小更新后使用以下命令删除节点上的维护预留 

```
sudo -i scontrol delete ReservationName=maint_for_update
```

欲了解更多详情，请访问 Slurm 预订，请[在此](https://slurm.schedmd.com/reservations.html)处查看 schedMD 官方文档。

## 容量变更时的集群更新过程
<a name="changes-per-process"></a>

调度器配置更改后，将在集群更新过程中执行以下步骤：
+ 停下来 AWS ParallelCluster `clustermgtd (supervisorctl stop clustermgtd)`
+ 生成已更新 Slurm 配置中的分区 AWS ParallelCluster 配置
+ 重启 `slurmctld`（通过 Chef 服务配方完成）
+ 检查 `slurmctld` 状态 `(systemctl is-active --quiet slurmctld.service)`
+ Reload Slurm 配置 `(scontrol reconfigure)`
+ 启动 `clustermgtd (supervisorctl start clustermgtd)`