

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

# 叢集容量大小和更新
<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)的執行個體數目上限。

在叢集建立時間或叢集更新時， `MinCount`會針對叢集中定義的每個運算資源 (`Scheduling/SlurmQueues/ ComputeResources`)，依在 中設定的數目 AWS ParallelCluster 啟動 Amazon EC2 執行個體。啟動以涵蓋叢集中運算資源最小數量節點的執行個體稱為***靜態節點**。*啟動後，除非發生特定事件或條件，否則靜態節點應持續存在於叢集中，系統不會終止這些節點。例如，這類事件包括 Slurm或 Amazon EC2 運作狀態檢查失敗，以及Slurm節點狀態變更為 DRAIN 或 DOWN。

在 `1`到 `‘MaxCount - MinCount’`(`MaxCount ` *減去*` MinCount)` ，隨需啟動以處理叢集負載增加的 Amazon EC2 執行個體，稱為***動態節點***。 它們的性質是暫時性的，它們被啟動來提供待定任務，一旦它們在叢集組態`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`的 。從 3.9.0 AWS ParallelCluster 版開始，減少佇列的大小需要停止運算機群，或將 的 [QueueUpdateStrategy](Scheduling-v3.md#yaml-Scheduling-SlurmSettings-QueueUpdateStrategy) 設定為 TERMINATE，才能進行叢集更新。在下列情況下，不需要停止運算機群或將 [QueueUpdateStrategy](Scheduling-v3.md#yaml-Scheduling-SlurmSettings-QueueUpdateStrategy) 設定為 TERMINATE：
+ 將新佇列新增至排程/[`SlurmQueues`](Scheduling-v3.md#Scheduling-v3-SlurmQueues)

   
+ 將新的運算資源`Scheduling/SlurmQueues/ComputeResources`新增至佇列
+ 增加運算資源`MaxCount`的
+ 增加運算資源的 MinCount 並增加相同運算資源至少相同數量的 MaxCount 

## 考量與限制
<a name="cluster-considerations-limitations"></a>

本節旨在概述調整叢集容量大小時應考慮的任何重要因素、限制或限制。
+ 從名稱為 `<Queue/Name>-*` `Scheduling/SlurmQueues`的所有運算節點移除佇列時，靜態和動態都會從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` ，則在減少 `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`和 `-30`上更新 `MaxCount: MinCount = MaxCount = 70`
  + 

    ```
    $ 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 < 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]
  ```
+ 將 \$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`，增加 `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]
  ```
+ 將 \$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 個靜態節點靜態節點來設定叢集，`<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]
  ```
+ 在 上更新 -30 `MinCount : MinCount = 70 (MaxCount = 120)`
+ 

  ```
  $ 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]
  ```
+ 在 上更新 -30 `MinCount : MinCount = 70 (MaxCount = 120)`
+ 

  ```
  $ 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>]`如果靜態節點受到 running.No 影響，系統將終止對應的 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 `MaxCount : MinCount = 100 (MaxCount = 120)`
+ 

  ```
  $ 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]
```

這將在節點 `maint_for_update` 上建立名為 的Slurm保留`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)`
+ 從 AWS ParallelCluster 組態產生更新的Slurm分割區組態
+ 重新啟動 `slurmctld`（透過 Chef 服務配方完成）
+ 檢查`slurmctld`狀態 `(systemctl is-active --quiet slurmctld.service)`
+ 重新載入Slurm組態 `(scontrol reconfigure)`
+ 啟動 `clustermgtd (supervisorctl start clustermgtd)`