

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

# Slurm Workload Manager (`slurm`)
<a name="slurm-workload-manager-v3"></a>

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

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

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

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

为应对集群负载增加而按需启动的 Amazon EC2 实例（范围在 `1` 到 `‘MaxCount - MinCount’`（`MaxCount ` *减去*` 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`，所有相应的计算节点都将是静态的，并且所有实例都将在集群 creation/update 时启动并保持正常运行。例如：

```
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"></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="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-only"></a>
+ 如果 `MinCount == MaxCount`，当增加 `MinCount`（和 `MaxCount`）时，通过将静态节点数扩展到 `MinCount` `<Queue/Name>-st-<ComputeResource/Name>-<new_MinCount>` 的新值来配置集群，并且系统将不断尝试启动 Amazon EC2 实例来满足新的静态容量需求。
+ 如果 `MinCount == MaxCount`，当 `MinCount`（和 `MaxCount`）的数量减少 N 时，通过移除最后 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="capacity-changes-mixed-nodes"></a>

如果 `MinCount < MaxCount`，当 `MinCount` 的数量增加 N 时（假设 `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]
  ```
+ 将 \+30 更新为 `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`，当 `MinCount` 和 `MaxCount` 的数量都增加 N 时，通过将静态节点数扩展到 `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]
  ```
+ 将 \+30 更新为 `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 个静态节点 `<Queue/Name>-st-<ComputeResource/Name>-[<old_MinCount - N>...<old_MinCount>` 来配置集群，系统将终止相应的 Amazon EC2 实例。此外，为了满足计算资源的 `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`，当 `MinCount` 和 `MaxCount` 的数量都减少 N 时，通过移除最后 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]
  ```

如果 `MinCount < MaxCount`，当 `MaxCount` 的数量减少 N 时（假设 `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="impacts-on-jobs"></a>

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

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

假设在计划的集群大小调整更新中，您将移除节点 `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]
```

这将在节点 `qeueu-st-computeresource-[9-10]` 上创建一个名为 `maint_for_update` 的 Slurm 预留。从创建预留开始，`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="cluster-update-process"></a>

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

有关 Slurm 的信息，请参阅 [https://slurm.schedmd.com](https://slurm.schedmd.com)。有关下载，请参阅 [https://github.com/SchedMD/slur](https://github.com/SchedMD/slurm/tags) m/tags。有关源代码，请参阅 [https://github.com/SchedMD/slurm](https://github.com/SchedMD/slurm)。

## 支持的集群版本和 SLURM 版本
<a name="cluster-slurm-version-table"></a>

下表列出了 AWS 支持的 AWS ParallelCluster 和Slurm版本。


| AWS ParallelCluster 版本 | 支持的 Slurm 版本 | 
| --- | --- | 
| 3.13.0 | 24.05.07 | 
| 3.12.0 | 23.11.10 | 
| 3.11.0 | 23.11.10 | 
| 3.9.2、3.9.3、3.10.0 | 23.11.7 | 
| 3.9.0、3.9.1 | 23.11.4 | 
| 3.8.0 | 23.02.7 | 
| 3.7.2 | 23.02.6 | 
| 3.7.1 | 23.02.5 | 
| 3.7.0 | 23.02.4 | 
| 3.6.0、3.6.1 | 23.02.2 | 
| 3.5.0、3.5.1 | 22.05.8 | 
| 3.4.0、3.4.1 | 22.05.7 | 
| 3.3.0、3.3.1 | 22.05.5 | 
| 3.1.4、3.1.5、3.2.0、3.2.1 | 21.08.8-2 | 
| 3.1.2、3.1.3 | 21.08.6 | 
| 3.1.1 | 21.08.5 | 
| 3.0.0 | 20.11.8 | 

**Topics**
+ [集群容量大小和更新](#cluster-capacity-size-and-update)
+ [集群容量更新](#cluster-capacity-update)
+ [注意事项和限制](#considerations-limitations)
+ [对作业的影响](#impacts-on-jobs)
+ [容量变更时的集群更新过程](#cluster-update-process)
+ [支持的集群版本和 SLURM 版本](#cluster-slurm-version-table)
+ [多个队列的配置](configuration-of-multiple-queues-v3.md)
+ [Slurm 多队列模式指南](multiple-queue-mode-slurm-user-guide-v3.md)
+ [Slurm 集群保护模式](slurm-protected-mode-v3.md)
+ [Slurm 集群快速容量不足故障转移](slurm-short-capacity-fail-mode-v3.md)
+ [Slurm 基于内存的调度](slurm-mem-based-scheduling-v3.md)
+ [Slurm 的多实例类型分配](slurm-multiple-instance-allocation-v3.md)
+ [动态节点的集群扩展](scheduler-node-allocation-v3.md)
+ [Slurm会计 AWS ParallelCluster](slurm-accounting-v3.md)
+ [Slurm 配置自定义](slurm-configuration-settings-v3.md)
+ [Slurm 和 `prolog``epilog`](slurm-prolog-epilog-v3.md)
+ [集群容量大小和更新](slurm-cluster-capacity-size-and-update.md)