

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Slurm 記憶體型排程
<a name="slurm-mem-based-scheduling-v3"></a>

從 3.2.0 版開始， AWS ParallelCluster 支援使用 / [`SlurmSettings`](Scheduling-v3.md#Scheduling-v3-SlurmSettings) [`EnableMemoryBasedScheduling`](Scheduling-v3.md#yaml-Scheduling-SlurmSettings-EnableMemoryBasedScheduling)叢集組態參數的Slurm記憶體型排程。

**注意**  
從 3.7.0 AWS ParallelCluster 版開始，如果您在[執行個體](Scheduling-v3.md#yaml-Scheduling-SlurmQueues-ComputeResources-Instances)中設定多個執行個體類型，`EnableMemoryBasedScheduling`則可以啟用 。  
對於 3.2.0 到 3.6.*x* AWS ParallelCluster 版，如果您在[執行個體](Scheduling-v3.md#yaml-Scheduling-SlurmQueues-ComputeResources-Instances)中設定多個執行個體類型，則`EnableMemoryBasedScheduling`無法啟用 。

**警告**  
當您在`EnableMemoryBasedScheduling`啟用 的Slurm佇列運算資源中指定多個執行個體類型時，該`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組態參數：
+ [https://slurm.schedmd.com/slurm.conf.html#OPT_CR_CPU_Memory](https://slurm.schedmd.com/slurm.conf.html#OPT_CR_CPU_Memory) (位於《`slurm.conf`》)。此選項會將節點記憶體設定為 中的消耗性資源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。當 false 時， Slurm不會在其排程演算法中包含記憶體做為資源，也不會追蹤任務使用的記憶體。使用者可以指定 `--mem MEM_PER_NODE`選項，以設定任務所需的每個節點的記憶體數量下限。這會強制排程器在排程任務`MEM_PER_NODE`時選擇`RealMemory`值至少為 的節點。

例如，假設使用者使用 提交兩個任務`--mem=5GB`。如果 CPUs或 GPUs 等請求的資源可用，任務可以同時在具有 8 GiB 記憶體的節點上執行。這兩個任務不會排程在小於 5 GiB 的運算節點上`RealMemory`。

**警告**  
停用記憶體型排程時， 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-cpu`並與Slurm文件中描述`--mem-per-gpu`的內容一致。例如，使用 提交任務`--ntasks-per-node=2 -c 1 --mem-per-cpu=2GB`。在此情況下， 會為每個節點Slurm指派總計 4 GiB 的任務。

**警告**  
啟用記憶體型排程時，我們建議使用者在提交任務時包含`--mem`規格。使用隨附的預設Slurm組態 AWS ParallelCluster，如果未包含記憶體選項 (`--mem`、 或 `--mem-per-gpu`)`--mem-per-cpu`， 會將已配置節點的整個記憶體Slurm指派給任務，即使它只請求一部分的其他資源，例如 CPUs或 GPUs。這樣可以有效地防止節點共用，直到任務完成為止，因為其他任務沒有可用的記憶體。這是因為當任務提交時未提供記憶體規格[https://slurm.schedmd.com/slurm.conf.html#OPT_DefMemPerNode](https://slurm.schedmd.com/slurm.conf.html#OPT_DefMemPerNode)時， Slurm會將任務的每個節點的記憶體設定為 。此參數的預設值為 0，並指定對節點記憶體的無限制存取。  
如果具有不同記憶體數量的多種運算資源可在相同佇列中使用，則提交而沒有記憶體選項的任務可能會在不同的節點上指派不同數量的記憶體。這取決於排程器提供給任務的節點。使用者可以在Slurm組態檔案中的叢集或分割區層級定義選項的自訂值[https://slurm.schedmd.com/slurm.conf.html#OPT_DefMemPerCPU](https://slurm.schedmd.com/slurm.conf.html#OPT_DefMemPerCPU)，例如 `DefMemPerNode`或 ，以防止此行為。

## 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 版開始，預設會將 `RealMemory`Amazon [Amazon EC2 執行個體類型](https://aws.amazon.com/ec2/instance-types)中列出的記憶體 AWS ParallelCluster 設定為 95%，並由 Amazon EC2 API [DescribeInstanceTypes](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeInstanceTypes.html) 傳回。

停用記憶體型排程時，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`的值，以限制任務可用的記憶體。