

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

# Slurm 基于内存的调度
<a name="slurm-mem-based-scheduling-v3"></a>

从 3.2.0 版开始，支持 AWS ParallelCluster Slurm 使用 [`SlurmSettings`](Scheduling-v3.md#Scheduling-v3-SlurmSettings)/[`EnableMemoryBasedScheduling`](Scheduling-v3.md#yaml-Scheduling-SlurmSettings-EnableMemoryBasedScheduling)集群配置参数进行基于内存的调度。

**注意**  
[从 3.7.0 AWS ParallelCluster 版开始，如果您在实例中配置了多个实例类型，则`EnableMemoryBasedScheduling`可以启用。](Scheduling-v3.md#yaml-Scheduling-SlurmQueues-ComputeResources-Instances)  
适用于 3.2.0 到 3.6 AWS ParallelCluster 版本。 {{x}}[，如果您在实例中配置了多个实例类型，则`EnableMemoryBasedScheduling`无法启用。](Scheduling-v3.md#yaml-Scheduling-SlurmQueues-ComputeResources-Instances)

**警告**  
当您在中指定多个实例类型时 Slurm 队列计算资源`EnableMemoryBasedScheduling`启用后，该`RealMemory`值为所有实例类型可用的最小内存量。如果您指定的实例类型具有截然不同的内存容量，则可能会导致大量未使用的内存。

随`EnableMemoryBasedScheduling: true`着，Slurm 调度器跟踪每个任务在每个节点上所需的内存量。然后，Slurm 调度器使用此信息在同一个计算节点上调度多个作业。作业在节点上所需的内存总量不能大于可用的节点内存。调度器可防止作业使用的内存超过提交作业时请求的内存。

使用 `EnableMemoryBasedScheduling: false`，作业可能会争夺共享节点上的内存并导致作业失败和 `out-of-memory` 事件。

**警告**  
Slurm 对其标签使用 2 的乘方表示法，例如 MB 或 GB。将这些标签分别读作 MiB 和 GiB。

## Slurm 基于配置和内存的调度
<a name="slurm-mem-based-scheduling-config-v3"></a>

随着`EnableMemoryBasedScheduling: true`，Slurm 设置以下内容 Slurm 配置参数：
+ `slurm.conf` 中的 [https://slurm.schedmd.com/slurm.conf.html#OPT_CR_CPU_Memory](https://slurm.schedmd.com/slurm.conf.html#OPT_CR_CPU_Memory)。此选项将节点内存配置为中的可消耗资源 Slurm.
+ [https://slurm.schedmd.com/cgroup.conf.html#OPT_ConstrainRAMSpace](https://slurm.schedmd.com/cgroup.conf.html#OPT_ConstrainRAMSpace)在 Slurm `cgroup.conf`。 使用此选项，作业对内存的访问权限仅限于提交作业时请求的内存量。

**注意**  
其他几个 Slurm 配置参数可能会影响的行为 Slurm 调度程序和资源管理器（如果设置了这两个选项）。有关更多信息，请参阅 [。Slurm 文档](https://slurm.schedmd.com/documentation.html)。

## Slurm 调度程序和基于内存的调度
<a name="slurm-mem-based-scheduling-scheduler-v3"></a>

**`EnableMemoryBasedScheduling: false`（默认值）**

默认情况下，`EnableMemoryBasedScheduling` 设置为 false。如果为假，Slurm 在其调度算法中不包括内存作为资源，也不跟踪作业使用的内存。用户可以指定 `--mem MEM_PER_NODE` 选项来设置作业所需的每个节点的最小内存量。这会强制调度器在调度作业时选择 `RealMemory` 值至少为 `MEM_PER_NODE` 的节点。

例如，假设用户提交了两个使用 `--mem=5GB` 的作业。如果请求的资源（如 CPUs 或）可用，则 GPUs 这些作业可以在内存为 8 GiB 的节点上同时运行。不会调度这两个作业在 `RealMemory` 小于 5 GiB 的计算节点上运行。

**警告**  
禁用基于内存的调度时，Slurm 不跟踪作业使用的内存量。在同一节点上运行的作业可能会争夺内存资源并导致其他作业失败。  
在禁用基于内存的调度时，我们建议用户不要指定 [https://slurm.schedmd.com/srun.html#OPT_mem-per-cpu](https://slurm.schedmd.com/srun.html#OPT_mem-per-cpu) 或 [https://slurm.schedmd.com/srun.html#OPT_mem-per-gpu](https://slurm.schedmd.com/srun.html#OPT_mem-per-gpu) 选项。这些选项可能导致的行为与中描述的有所不同 [Slurm 文档](https://slurm.schedmd.com/documentation.html)。

**`EnableMemoryBasedScheduling: true`**

当设置`EnableMemoryBasedScheduling`为 true 时，Slurm 使用`--mem`提交选项跟踪每个作业的内存使用情况，并防止作业使用的内存超过请求的内存量。

在上面的示例中，用户提交了两个使用 `--mem=5GB` 的作业。这些作业无法在内存为 8 GiB 的节点上同时运行。这是因为所需的总内存量大于节点上可用的内存量。

启用基于内存的调度后，其`--mem-per-gpu`行为`--mem-per-cpu`与中描述的内容保持一致 Slurm 文档中）。例如，使用 `--ntasks-per-node=2 -c 1 --mem-per-cpu=2GB` 提交作业。在这种情况下，Slurm 为每个节点分配总计 4 GiB 的任务。

**警告**  
启用基于内存的调度后，我们建议用户在提交作业时包含 `--mem` 规范。使用默认值 Slurm 包含的配置 AWS ParallelCluster，如果不包含内存选项（`--mem``--mem-per-cpu`、或`--mem-per-gpu`），Slurm 将分配的节点的全部内存分配给该作业，即使它只请求一部分其他资源，例如 CPUs 或 GPUs。这可在作业完成之前有效地防止节点共享，因为没有内存可用于其他作业。发生这种情况是因为 Slurm 将作业的每个节点的内存设置为在提交作业[https://slurm.schedmd.com/slurm.conf.html#OPT_DefMemPerNode](https://slurm.schedmd.com/slurm.conf.html#OPT_DefMemPerNode)时未提供任何内存规格时。此参数的默认值为 0，指定的是对节点内存进行无限制访问。  
如果同一个队列中存在多种具有不同内存量的计算资源，则在不同的节点上可能会为不带内存选项的已提交作业分配不同的内存量。这取决于调度器为作业提供了哪些节点。用户可以在集群或分区级别为选项（例如`DefMemPerNode`或 [https://slurm.schedmd.com/slurm.conf.html#OPT_DefMemPerCPU](https://slurm.schedmd.com/slurm.conf.html#OPT_DefMemPerCPU)）定义自定义值 Slurm 配置文件以防止这种行为。

## Slurm RealMemory 和 AWS ParallelCluster SchedulableMemory
<a name="slurm-mem-based-scheduling-realmemory-v3"></a>

使用 Slurm 随附的配置 AWS ParallelCluster，Slurm 解释[RealMemory](https://slurm.schedmd.com/slurm.conf.html#OPT_RealMemory)为每个节点可用于作业的内存量。从版本 3.2.0 开始，默认 AWS ParallelCluster 设置`RealMemory`为[亚马逊 EC2 实例类型中列出并由亚马逊](https://aws.amazon.com/ec2/instance-types) EC2 API [DescribeInstanceTypes](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeInstanceTypes.html)返回的内存的 95%。

禁用基于内存的调度时，Slurm 当用户提交`--mem`指定任务时`RealMemory`，调度器用于筛选节点。

启用基于内存的调度后，Slurm 调度器解释`RealMemory`为计算节点上运行的作业可用的最大内存量。

默认设置可能不是所有实例类型的最佳设置：
+ 此设置可能高于节点实际可以访问的内存量。当计算节点是小型实例类型时，可能会发生这种情况。
+ 此设置可能低于节点实际可以访问的内存量。当计算节点是大型实例类型时，可能会发生这种情况，并可能导致大量未使用的内存。

您可以使用 [`SlurmQueues`](Scheduling-v3.md#Scheduling-v3-SlurmQueues)/[`ComputeResources`](Scheduling-v3.md#Scheduling-v3-SlurmQueues-ComputeResources)/[`SchedulableMemory`](Scheduling-v3.md#yaml-Scheduling-SlurmQueues-ComputeResources-SchedulableMemory)微调计算节点 AWS ParallelCluster 的`RealMemory`配置值。要覆盖默认值，请针对您的集群配置专门为 `SchedulableMemory` 定义一个自定义值。

要检查计算节点的实际可用内存，请在该节点上运行 `/opt/slurm/sbin/slurmd -C` 命令。此命令可返回节点的硬件配置，包括 [https://slurm.schedmd.com/slurm.conf.html#OPT_RealMemory](https://slurm.schedmd.com/slurm.conf.html#OPT_RealMemory) 值。有关更多信息，请参阅 [https://slurm.schedmd.com/slurmd.html#OPT_-C](https://slurm.schedmd.com/slurmd.html#OPT_-C)。

确保计算节点的操作系统进程有足够的内存。为此，请将 `SchedulableMemory` 值设置为低于 `slurmd -C` 命令返回的 `RealMemory` 值，从而限制作业可用的内存。