---
# System prepended metadata

title: Slurm 概念、術語、節點屬性、節點狀態、 Partition 屬性詳解表
tags: [JobAccounting, scontrol, Association, Slurm-on-Kubernetes, FairShare, srun, sinfo, Partition, Node-Attributes, Multi-Cluster, salloc, Slurm, Configless, squeue, GPU, Linux, TLS, Node-State, Scheduler, Job, sackd, LDAP, Backfill, JobArray, sacct, auth-slurm, TRES-Tracking, DRAINING, GRES, Prolog, sreport, sbatch, Draining, Slurmd, Slurmdbd, Authentication, Node, Slinky, slurm-operator, Cluster, QoS, sshare, Billing, Drain, Partition-Attributes, AuthType, MUNGE, Federation, DRAINED, SlinkyProject, JobStep, Slurmstepd, sacctmgr, Slurmctld, Kubernetes, K8s, auth-munge, TRES, Account, HPC, Accounting, Epilog, SACK]

---

Slurm 概念、術語、節點屬性、節點狀態、 Partition 屬性詳解表
===
###### tags: `Slurm`
###### tags: `Slurm`, `HPC`, `Linux`, `Slinky`, `SlinkyProject`, `Cluster` `Scheduler` `Slurmctld` `Slurmd` `Slurmstepd` `Slurmdbd` `Accounting` `JobAccounting` `TRES` `TRES-Tracking` `Billing` `GRES` `GPU` `Federation` `Multi-Cluster` `Association` `Account` `QoS` `FairShare` `Backfill` `Job` `JobStep` `JobArray` `Node` `Node-Attributes` `Node-State` `Partition` `Partition-Attributes` `Drain` `Draining` `DRAINED` `DRAINING` `Prolog` `Epilog` `Authentication` `AuthType` `auth-munge` `MUNGE` `auth-slurm` `SACK` `sackd` `TLS` `LDAP` `Kubernetes` `K8s` `Slurm-on-Kubernetes` `slurm-operator` `Configless` `scontrol` `sinfo` `squeue` `sbatch` `srun` `salloc` `sacct` `sacctmgr` `sreport` `sshare`

<br>

[TOC]

<br>

## 概念
### 作業會計 (Job Accounting)
- **用途**：
    - **儲存作業歷史**: 所有提交的作業 (job)、步驟 (step)、資源使用情況
    - **追蹤資源消耗**: CPU 時間、記憶體使用、GPU 使用 (`AccountingStorageTRES: gres/gpu`)
    - **作業狀態記錄**: 開始/結束時間、退出碼、執行節點資訊

### 資源計量 (TRES Tracking)
- **配置**: AccountingStorageTRES=gres/gpu
- **用途**：
    - 追蹤 **Trackable RESources** (CPU、記憶體、GPU、節點數等)
    - 提供給 **資源配額 (QoS)** 和 **計費 (Billing)** 系統使用
    - 支援 GPU 等特殊資源的使用統計

### 多叢集管理 (Federation Support)
- **設定位置**: `helm/slurm/values.yaml:42` (`clusterName`)
- **用途**：
    - **單一資料庫儲存多個 Slurm 叢集** 的會計資料
    - 支援跨叢集的資源使用報表
    - 提供統一的使用者配額管理

### 使用者與專案管理
- **功能**：
    - **Association 管理**: 使用者與帳號 (account) 的關聯
    - **QoS (Quality of Service)**: 資源使用限制與優先權設定
    - **Fair Share 排程**: 基於歷史使用量的公平排程
- **範例指令**：
    ```bash
    sacctmgr add account research
    sacctmgr add user alice account=research
    sacct -j 12345  # 查詢作業 12345 的會計資訊
    ```

### 歷史資料查詢
- **對應指令**：
    - `sacct`: 查詢已完成作業的詳細資訊
    - `sreport`: 生成叢集使用報表
    - `sshare`: 查看 Fair Share 資訊
- **實際應用**：
    - 追蹤過去 6 個月的 GPU 使用率
    - 計算各專案的運算成本
    - 分析節點故障對作業完成率的影響


### Slurmdbd 是必要的原因
1. **持久化儲存**: Slurmctld 的 `StateSaveLocation` 只儲存當前狀態，作業完成後資訊會被清理
2. **歷史查詢**: 所有的作業歷史、資源使用報表都需要 Slurmdbd
3. **進階功能**: Fair Share、QoS、Multi-cluster 等企業級功能的基礎
4. **審計需求**: 提供完整的資源使用審計軌跡
5. **當啟用 accounting 時**：
    | 功能 | 無 Slurmdbd | 有 Slurmdbd |
    |------|------------|------------|
    | 作業歷史查詢 | ❌ 無法使用 `sacct` | ✅ 完整歷史記錄 |
    | Fair Share 排程 | ❌ 無法計算 | ✅ 基於歷史使用量 |
    | 資源配額管理 | ❌ 只能硬限制 | ✅ 動態 QoS 控制 |
    | 多叢集管理 | ❌ 各叢集獨立 | ✅ 統一管理 |
    | GPU 使用追蹤 | ❌ 無記錄 | ✅ 精確計量 |

<br>

---

<br>

## 術語
> by Claude Sonnet-4.5 (2025/11/21)

| 術語 | 英文 | 中文 | 說明 |
|------|------|------|------|
| Account | Account | 帳戶 | 用於追蹤和限制資源使用的帳戶群組 |
| Allocation | Allocation | 資源分配 | 分配給作業的資源集合 |
| Association | Association | 關聯 | 使用者、帳戶和叢集之間的關係 |
| Backfill | Backfill Scheduling | 回填排程 | 允許較小的作業在等待佇列中提前執行的排程策略 |
| Burst Buffer | Burst Buffer | 突發緩衝區 | 高速臨時儲存空間，用於提升 I/O 效能 |
| Cluster | Cluster | 叢集 | Slurm 管理的計算資源集合 |
| Controller | Controller (slurmctld) | 控制器 | Slurm 的中央管理守護程序 |
| Daemon | Daemon (slurmd) | 守護程序 | 在計算節點上運行的 Slurm 代理程序 |
| Federation | Federation | 聯邦 | 多個 Slurm 叢集的集合 |
| GRES | Generic RESource | 通用資源 | GPU、網路卡等特殊硬體資源 |
| Job | Job | 作業 | 使用者提交的計算任務 |
| Job Array | Job Array | 作業陣列 | 批次提交的多個相似作業 |
| Job Step | Job Step | 作業步驟 | 作業內的個別執行任務 |
| Node | Node | 節點 | 叢集中的單一計算伺服器 |
| Partition | Partition | 分區 | 具有特定限制和優先權的節點群組 |
| Priority | Priority | 優先權 | 決定作業排程順序的數值 |
| QoS | Quality of Service | 服務品質/資源配額 | 定義資源使用限制和優先權的策略 |
| Reservation | Reservation | 預留 | 為特定使用者或群組預留的資源 |
| SBATCH | SBATCH | 批次作業提交 | 用於提交批次作業的命令 |
| Scheduler | Scheduler | 排程器 | 決定作業執行順序和資源分配的元件 |
| SRUN | SRUN | 執行命令 | 在分配的節點上執行並行作業的命令 |
| Task | Task | 任務 | Job Step 中的單一程序實例 |
| TRES | Trackable RESources | 可追蹤資源 | CPU、記憶體、GPU 等可計量和追蹤的資源 |
| Wckey | Workload Characterization Key | 工作負載特徵鍵 | 用於追蹤和分類不同類型工作負載的標籤 |

<br>

---

<br>

## Slurm 節點範例
### `scontrol show nodes`
```
root@slurm-login-slinky-5f786bb6f9-dqcrw:/tmp# scontrol show nodes     
NodeName=c2m4-0 Arch=x86_64 CoresPerSocket=22 
   CPUAlloc=0 CPUEfctv=4 CPUTot=88 CPULoad=16.79
   AvailableFeatures=c2m4
   ActiveFeatures=c2m4
   Gres=(null)
   NodeAddr=10.244.65.123 NodeHostName=c2m4-0 Version=25.11.0
   OS=Linux 5.15.0-144-generic #157-Ubuntu SMP Mon Jun 16 07:33:10 UTC 2025 
   RealMemory=515856 AllocMem=0 FreeMem=53539 Sockets=2 Boards=1
   CoreSpecCount=42 CPUSpecList=2-43,46-87 MemSpecLimit=511760
   State=IDLE+DYNAMIC_NORM ThreadsPerCore=2 TmpDisk=0 Weight=1 Owner=N/A MCS_label=N/A
   BootTime=2025-07-22T02:59:20 SlurmdStartTime=2025-12-05T04:07:10
   LastBusyTime=2025-12-05T04:07:10 ResumeAfterTime=None
   CfgTRES=cpu=4,mem=515856M,billing=4
   AllocTRES=
   CurrentWatts=0 AveWatts=0
   Comment={"namespace":"slurm","podName":"slurm-worker-c2m4-0","node":"ntuh-dev-master01"}
```


<br>

---

<br>

### **節點 (Node) 屬性**

| 屬性名稱 | 說明 | 用途 | 範例值 | 備註 |
|---------|------|------|--------|------|
| **CPU 相關** |
| `CPUTot` | 節點總 CPU 數量 | 硬體實際的 CPU 總數（邏輯核心） | 88 | Sockets × CoresPerSocket × ThreadsPerCore |
| `CPUEfctv` | 有效可用 CPU 數 | 扣除系統保留後，可分配給 job 的 CPU 數 | 4 | CPUTot - CoreSpecCount |
| `CPUAlloc` | 已分配 CPU 數 | 當前已被 job 使用的 CPU 數量 | 0 | 用於監控資源使用率 |
| `CPULoad` | CPU 負載 | 節點當前的平均負載 | 18.03 | 系統實際負載，非 Slurm 控制 |
| `Sockets` | CPU 插槽數 | 實體 CPU 數量 | 2 | 硬體配置 |
| `CoresPerSocket` | 每插槽核心數 | 每顆 CPU 的實體核心數 | 22 | 硬體配置 |
| `ThreadsPerCore` | 每核心執行緒數 | 超執行緒技術，通常為 1 或 2 | 2 | 1=關閉超執行緒，2=開啟 |
| `CoreSpecCount` | 系統保留核心數 | 保留給系統使用的核心數，不分配給 job | 42 | **過高會導致可用 CPU 極少** |
| `CPUSpecList` | 系統保留 CPU 列表 | 具體保留哪些 CPU ID | 2-43,46-87 | 與 CoreSpecCount 對應 |
| **記憶體相關** |
| `RealMemory` | 實體記憶體總量 | 節點實際的 RAM 容量 (MB) | 515856M (~504GB) | 硬體配置 |
| `FreeMem` | 當前可用記憶體 | 系統層級的可用記憶體 | 53539M (~52GB) | 實時監控值 |
| `AllocMem` | 已分配記憶體 | Slurm 已分配給 job 的記憶體 | 0 | Slurm 層級的分配 |
| `MemSpecLimit` | 系統保留記憶體上限 | 保留給系統使用的記憶體量 (MB) | 511760M | **過高會導致可分配記憶體極少** |
| **狀態相關** |
| `State` | 節點狀態 | 當前運作狀態 | `IDLE` / `DOWN` | 詳見狀態表 |
| `Reason` | 狀態原因 | 非正常狀態的原因說明 | "Not responding" | DOWN 時必有原因 |
| **TRES (Trackable Resources)** |
| `CfgTRES` | 配置的可追蹤資源 | Slurm 管理的資源總量 | cpu=4,mem=515856M | 基於 CPUEfctv 計算 |
| `AllocTRES` | 已分配的資源 | 當前已分配給 job 的資源 | (空) | 用於資源追蹤 |
| **其他** |
| `Gres` | 通用資源 | GPU 等特殊資源配置 | (null) / gpu:2 | 需要額外配置 |
| `Weight` | 節點權重 | 調度優先級，數字越大越優先 | 1 | 影響 job 分配順序 |
| `TmpDisk` | 臨時磁碟空間 | /tmp 可用空間 (MB) | 0 | 0 表示未配置 |

<br>

---

<br>

### **節點狀態 (State)**

| 狀態 | 說明 | 原因 | 處理方式 |
|------|------|------|---------|
| `IDLE` | 閒置可用 | 無 job 運行，可接受新 job | 正常狀態 |
| `ALLOCATED` | 已分配 | 有 job 正在運行 | 正常狀態 |
| `MIXED` | 部分使用 | 部分 CPU/記憶體已分配，仍有空餘 | 正常狀態 |
| `DOWN` | 離線 | slurmd 未運行或網路問題 | 檢查節點服務 |
| `DRAINED` | 排空中 | 管理員手動設為不接受新 job | 使用 `scontrol update state=resume` |
| `DRAINING`(`drng`) | 排空中 | 等待現有 job 完成後下線 | 等待或取消 job |
| `NOT_RESPONDING` | 無回應 | slurmd 停止回應 | 重啟 slurmd |
| `DYNAMIC_NORM` | 動態正常 | 節點可動態創建/銷毀（雲環境） | 正常標記 |

- ### **ALLOCATED** 和 **MIXED** 的關鍵差異：
    | 狀態 | 說明 | 資源使用狀態 |
    |------|------|-------------|
    | **ALLOCATED** | **整個節點**已被一個或多個 job 完全佔用 | 所有 CPU/記憶體資源已分配，**無剩餘資源**可供新 job 使用 |
    | **MIXED** | **部分資源**已被 job 佔用 | 仍有**部分 CPU/記憶體空閒**，可接受新 job（若配置允許 job 共享節點） |

    **簡單來說：**
    - `ALLOCATED` = 節點滿載
    - `MIXED` = 節點部分使用，仍有空間

<br>

---

<br>

## Slurm Partition 範例

### `scontrol show partition`
```
root@slurm-login-slinky-5f786bb6f9-dqcrw:/tmp# scontrol show partition        
PartitionName=cpu-set
   AllowGroups=ALL AllowAccounts=ALL AllowQos=ALL
   AllocNodes=ALL Default=YES QoS=N/A
   DefaultTime=NONE DisableRootJobs=NO ExclusiveUser=NO ExclusiveTopo=NO GraceTime=0 Hidden=NO
   MaxNodes=UNLIMITED MaxTime=UNLIMITED MinNodes=1 LLN=NO MaxCPUsPerNode=UNLIMITED MaxCPUsPerSocket=UNLIMITED
   Nodes=c2m4-0
   PriorityJobFactor=1 PriorityTier=1 RootOnly=NO ReqResv=NO OverSubscribe=NO
   OverTimeLimit=NONE PreemptMode=OFF
   State=UP TotalCPUs=88 TotalNodes=1 SelectTypeParameters=NONE
   JobDefaults=(null)
   DefMemPerNode=UNLIMITED MaxMemPerNode=UNLIMITED
   TRES=cpu=4,mem=515856M,node=1,billing=4
```

<br>

---

<br>

### **Partition 屬性**

| 屬性名稱 | 說明 | 用途 | 範例值 | 備註 |
|---------|------|------|--------|------|
| **基本設定** |
| `PartitionName` | Partition 名稱 | 識別不同的佇列 | cpu-set | 提交 job 時用 `-p` 指定 |
| `Nodes` | 包含的節點列表 | 此 partition 可使用的節點 | c2m4-0 | 可用逗號分隔多節點 |
| `Default` | 是否為預設 | 未指定 `-p` 時使用 | YES / NO | 只能有一個 default |
| `State` | Partition 狀態 | 是否可用 | UP / DOWN | DOWN 時無法提交 job |
| **資源限制** |
| `TotalCPUs` | 總 CPU 數 | partition 內所有節點的 CPU 總和 | 88 | 所有節點的 CPUTot 加總 |
| `TotalNodes` | 總節點數 | partition 內的節點數量 | 1 | - |
| `MinNodes` | 最小節點數 | job 至少需要的節點數 | 1 | 防止資源浪費 |
| `MaxNodes` | 最大節點數 | job 最多可使用的節點數 | UNLIMITED | 可限制大型 job |
| `MaxCPUsPerNode` | 每節點最大 CPU | 單節點可分配的最大 CPU 數 | UNLIMITED | 防止單 job 佔用過多 |
| `DefMemPerNode` | 預設記憶體 | 未指定 `--mem` 時的預設值 | UNLIMITED / 1024 | **UNLIMITED 可能導致分配失敗** |
| `MaxMemPerNode` | 最大記憶體 | 單節點可分配的最大記憶體 | UNLIMITED | 防止 OOM |
| **時間限制** |
| `DefaultTime` | 預設執行時間 | 未指定 `-t` 時的預設值 | NONE / 01:00:00 | NONE 表示使用 MaxTime |
| `MaxTime` | 最大執行時間 | job 執行時間上限 | UNLIMITED | 超時會被終止 |
| **權限控制** |
| `AllowGroups` | 允許的群組 | 哪些 Linux 群組可使用 | ALL / group1,group2 | 訪問控制 |
| `AllowAccounts` | 允許的帳號 | 哪些 Slurm 帳號可使用 | ALL / account1 | 計費和配額管理 |
| `AllowQos` | 允許的 QoS | 哪些服務品質等級可用 | ALL / normal,high | 優先級管理 |
| **調度設定** |
| `PriorityJobFactor` | Job 優先級因子 | 影響 job 調度順序 | 1 | 數字越大越優先 |
| `OverSubscribe` | 過度訂閱 | 是否允許共享節點 | NO / YES:4 | NO=獨占，YES=共享 |
| `ExclusiveUser` | 用戶獨占 | 同一用戶的 job 是否獨占節點 | NO / YES | 防止用戶間干擾 |
| `TRES` | Partition 的資源統計 | 可追蹤的資源總量 | cpu=4,mem=515856M | 基於節點的 CfgTRES |

<br>

---

<br>

## **常用查詢指令**

```bash
# 查看節點詳細資訊
scontrol show node <nodename>

# 查看 partition 詳細資訊
scontrol show partition <partition_name>

# 查看節點摘要
sinfo -Nel

# 查看資源使用情況
squeue -o "%.18i %.9P %.8j %.8u %.2t %.10M %.6D %R %C"
# 範例：
# JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON) CPUS
#   168   cpu-set    sleep tj_tsai@  R       0:26      1 c2m4-0 2

# 即時監控節點狀態
watch -n 2 'sinfo -Nel'
```

<br>

---

<br>

## 補充術語詳解

### drain & draining 的中文
- ### Question
    K8s 的 drain & draining，對應的中文翻譯為何？
- ### gpt-5.2 (2025/12/16)
    在 Kubernetes（K8s）情境下：

    * **drain（動詞 / 指令 `kubectl drain`）**：常翻成 **「排空」**（也有人說「疏散」或「清空節點」）
      * 意思是：把某個 Node 上可搬走的 Pod **驅逐（evict）**到其他 Node，讓這台機器可以維修/下線。
    * **draining（進行式 / 狀態描述）**：常翻成 **「排空中」**（或「疏散中」）
      * 意思是：正在進行 drain 的過程。

    實務上你會常看到這種寫法：
    * **Node is draining** → **節點排空中**
    * **Drain the node** → **排空節點**
    * **Node drained** → **節點已排空**

<br>

---

<br>

### Prolog
- ### Google AI Mode (2025/12/11)
    Slurm 的 **Prolog**（前言腳本）是系統管理員定義的一系列腳本，會在作業開始執行**之前**自動在計算節點上執行。它們是 Slurm 工作負載管理器配置的關鍵部分，主要用於準備作業環境並驗證節點是否準備就緒。

    ## 目的與功能

    Prolog 腳本對於以下任務至關重要：

    * **環境準備**：設定必要的環境變數（儘管可能需要 `TaskProlog` 來設定特定的使用者作業環境變數）。
    * **資源管理**：管理資源，例如電源策略（例如，與 NVIDIA 的 DPS 整合時）。
    * **健康檢查**：確保分配的計算節點在使用者作業開始前是健康的且配置正確。
    * **安全與清理**：複製必要檔案、管理許可證，有時與作業完成後進行清理的 Epilog（後記腳本）協同運作。

    ## 執行詳情

    * **時機**：Prolog 腳本在資源分配後但在作業主要任務啟動前執行。
    * **位置**：腳本在分配的計算節點上執行。
    * **權限**：根據使用的特定配置參數，它們通常以 `SlurmUser`（在計算節點上通常是 `root`）的身份運行，而不是提交作業的使用者身份。
    * **配置**：腳本的路徑在 `slurm.conf` 配置文件中使用 `Prolog` 或 `PrologSlurmctld` 等參數定義。
    * **故障處理**：如果 Prolog 腳本以非零狀態退出，則作業將不會執行，並且分配的計算節點將被設為 `DRAIN`（排空）狀態，以防止在問題解決之前被進一步使用。

    有關更深入的技術文件，您可以參考 SchedMD 提供的官方 Slurm Prolog 和 Epilog 指南。

<br>

---

<br>

### sackd
> - **白話解釋**
>   - 在 login node 上，執行 srun / sbatch / squeue / ... 時，要先跟叢集做認證才能授權執行
>   - sackd (Slurm Auth and Cred Kiosk Daemon)，是用來協助 login 節點完成認證的角色
> - **核心概念**
>   - `sackd` 是 Slurm 在「非計算節點（例如 login node/pod）」上提供的 **認證與憑證服務守護程序**，讓該節點能安全地和 `slurmctld` 互動。
>   - 它通常以 **本機 Unix socket** 的形式提供服務端點，供同節點上的 Slurm client 指令使用。

- ### sackd 在 Slinky 中扮演的角色
    - ### gpt-5.2 (2025/12/18)
        在 **Slinky（Slurm-on-Kubernetes）** 的典型部署裡，`sackd` 通常是跑在 **Login Pod** 內的一個 Slurm 守護程序，角色/用途可以用「讓登入節點也能安全地跟 Slurm 叢集互動」來概括。 ([Amazon Web Services, Inc.][20251218-A-1])

        ### sackd 在 Slinky 中扮演的角色

        * **補足 Login Pod 的「叢集認證能力」**：Login Pod 往往不跑 `slurmd`（那是 worker/compute pod 的 daemon），但使用者會在 Login Pod 上執行 `sbatch / srun / salloc` 等 Slurm client commands；`sackd` 就是用來讓這類「不跑 slurmd 的登入節點」仍能完成對叢集的認證與憑證處理。 ([Slurm][20251218-A-2])
        * **支援 configless 架構（從 controller 拉設定）**：在 Slurm 的 configless 模式下，`sackd` 可以透過 `--conf-server <slurmctld host[:port]>` 向 `slurmctld` 取得設定並寫入快取（預設在 `/run/slurm/conf`，也可由 `RUNTIME_DIRECTORY` 調整）。這讓 Login Pod 不必在映像檔內硬塞完整設定檔，也比較符合雲原生的部署方式。 ([Slurm][20251218-A-2])
        * **提供本機認證服務端點（Unix socket）**：`sackd` 會在 runtime 目錄下建立並維護 `sack.socket`（預設在 `/run/slurm/`，也可用 `RUNTIME_DIRECTORY` 改位置），讓同一個 pod 內的 Slurm client commands 能透過這個 socket 使用認證服務。 ([Slurm][20251218-A-2])

        ### 它「不是」做什麼

        * `sackd` **不是排程器**（排程/決策仍在 `slurmctld`），也 **不負責啟動計算任務**（那是 `slurmd/slurmstepd` 的範疇）。它更像是 Login Pod 的「Slurm 認證/憑證前端」。 ([Slurm][2])

        [20251218-A-1]: https://aws.amazon.com/blogs/containers/running-slurm-on-amazon-eks-with-slinky/ "Running Slurm on Amazon EKS with Slinky | Containers"
        [20251218-A-2]: https://slurm.schedmd.com/sackd.html "Slurm Workload Manager - sackd"

- ### sackd 是採用 munge 加解密訊息嗎?
    - ### gpt-5.2 (2025/12/18)
        不一定；**取決於你在 `slurm.conf` 設定的 `AuthType`**。

        * 如果叢集用的是 **`AuthType=auth/munge`**：Slurm 的認證會走 **MUNGE**（需要 `munged` 與共用的 `munge.key`），也就是你說的那種「用 MUNGE 產生/驗證憑證」的機制。 ([Slurm][20251218-B-1])
        * 但 **`sackd` 本身是為 `auth/slurm`（SACK）設計的登入節點認證 daemon**：官方描述它是「Slurm Auth and Cred Kiosk Daemon」，用在**沒跑 `slurmd` 的 login node**，讓 client commands 也能對叢集完成認證；而且文件也明確提到「對於使用 `auth/slurm` 的站點，`sackd` 會提供 client commands 的認證」。 ([Slurm][20251218-B-2])

        所以更精準地回答你的問題：

        **在 `AuthType=auth/slurm` 的架構下，`sackd` 不依賴 MUNGE 來做認證；它走的是 Slurm 的 `auth/slurm`（SACK）機制。** ([Slurm][20251218-B-2])

        想快速確認你目前是哪一種：看 `slurm.conf` 的 `AuthType`（`auth/munge` vs `auth/slurm`）就能判斷。 ([Slurm][20251218-B-1])

        [20251218-B-1]: https://slurm.schedmd.com/authentication.html?utm_source=chatgpt.com "Authentication Plugins - Slurm Workload Manager -"
        [20251218-B-2]: https://slurm.schedmd.com/sackd.html?utm_source=chatgpt.com "sackd - Slurm Workload Manager - SchedMD"

- ### 網際網路 & Slurm 叢集元件間 & LDAP 的通訊協定與安全機制
    - ### gpt-5.2 (2025/12/18)
        | 場景  | 主要通訊協定 | 安全機制 | 提供的安全性重點 | 常見連接埠 | 補充  |
        |------|------------|----------|---------------|----------|------|
        | 網際網路 Web/API  | HTTP | TLS（= HTTPS） | 機密性（加密）+完整性+伺服器驗證（可選客戶端憑證） | 80/443  | 「SSL/TLS」多半是俗稱；現代以 TLS 為主 |
        | Slurm 叢集元件間（controller/worker/login/db/clients） | Slurm RPC over TCP | AuthType（`auth/munge` 或 `auth/slurm`）+（可選）TLSType（TLS） | AuthType：通訊雙方驗證/憑證；TLSType：在傳輸層提供 TLS 加密/完整性 | 常見 6817/6818 等（依設定） | 官方文件明確指出 Slurm 元件間通訊會做驗證，且可透過 `TLSType` 啟用 TLS（如 `tls/s2n`）([Slurm](https://slurm.schedmd.com/quickstart_admin.html)) |
        | LDAP client ↔ server  | LDAP | TLS：StartTLS 或 LDAPS | 機密性（加密）+完整性；避免 simple bind 密碼明碼傳輸  | 389（ldap/StartTLS）、636（ldaps） | OpenLDAP 文件：TLS 可透過 StartTLS 或 `ldaps://`，且 StartTLS 是標準機制；也提到常見的 389/636 ([openldap.org](https://www.openldap.org/doc/admin24/security.html)) |
        
        ![image](https://hackmd.io/_uploads/B1HuyXbXbg.png)

    
- ### 延伸閱讀
    - [Kubernetes Operator for Slurm Clusters -- Controller](https://slinky.schedmd.com/projects/slurm-operator/en/release-1.0/index.html#controller)
        > [\!NOTE] The kubelet’s `configMapAndSecretChangeDetectionStrategy` and `syncFrequency` settings directly affect when pods have their mounted ConfigMaps and Secrets updated. By default, the kubelet is in Watch mode with a polling frequency of 60 seconds.


<br>

---

<br>

### Job vs Job Step
- ### gpt-5.2 (2026/01/07)
    在 Slurm 裡：

    * **Job（作業）**＝「排程與資源分配」的單位（allocation）
    * **Job Step（作業步驟 / step）**＝「在這份資源裡實際啟動的一次平行執行」的單位（execution）

    把它想成：

    > 你去餐廳訂位（Job：訂到一張 10 人桌、2 小時）
    > 在你訂到的桌子上點菜上菜（Step：先上前菜、再上主餐、也可以同時上兩道）

    ---

    ## Job 是什麼？（allocation 的擁有者）

    **Job 的核心責任：**

    1. **向排程器請資源**：要幾個節點、幾顆 CPU、幾張 GPU、多久、哪個 partition/QoS…
    2. **排隊 / 被排到**：slurmctld 只需要決定「這個 Job 什麼時候拿到哪些資源」
    3. **資源的上限框**：Job 拿到的 allocation 是上限，後面任何 step **都不能超過**這個上限

    你看到的典型 Job 產生方式：

    * `sbatch script.sh` → 提交一個 batch job
    * `salloc ...` → 先拿 allocation（互動式）
    * 有時 `srun ...`（在沒有 allocation 的情況）也會直接「申請 job + 啟一個 step」（看站台設定/用法）

    ---

    ## Job Step 是什麼？（在 allocation 裡啟動的執行）

    **Step 的核心責任：**

    1. **在 Job 的 allocation 裡啟動一組程序（tasks）**：例如 MPI ranks、或多節點跑你的程式
    2. **定義這次啟動的執行細節**：tasks 數、每 task 幾 CPU（`--cpus-per-task`）、GPU（`--gpus-per-task`）、綁核/綁 GPU、環境變數、IO、cgroup 限制等
    3. **可以有很多個**：同一個 job 裡可以跑多個 steps（可串行、也可並行）

    Step 通常由這些指令產生：

    * 在 job 裡呼叫 `srun ...` → 每一次 `srun` 幾乎都會建立一個新的 step
    * 一些工作流會用 `srun` 啟動不同階段：前處理、訓練、後處理…（每個都是 step）

    ---

    ## 最關鍵差異：誰在管「排程」 vs 誰在管「啟動程序」

    * **Job：slurmctld 管**（何時給你資源、資源給多少）
    * **Step：slurmstepd / slurmd 管**（在已分配的節點上把你的 tasks 真的 fork/exec 起來、套用 cgroup/綁定等）

    ---

    ## 具體例子：一個 job 裡兩個 steps

    `train.sbatch`：

    ```bash
    #!/bin/bash
    #SBATCH -N 2
    #SBATCH --ntasks-per-node=4
    #SBATCH --gpus-per-node=4
    #SBATCH -t 00:30:00

    # step 1：前處理（可能只用 CPU）
    srun --ntasks=2 python prep.py

    # step 2：訓練（用滿 GPU）
    srun --ntasks=8 --gpus-per-task=1 python train.py
    ```

    這裡：

    * **整份資源（2 nodes、每 node 4 tasks、每 node 4 GPU、30 分鐘）** 是 **Job**
    * 兩行 `srun ...` 各自啟動一次平行執行，是 **兩個 Job Steps**

    你在帳務/ID 上常會看到：

    * JobID：`12345`
    * Step：`12345.0`、`12345.1`（或 `12345.batch`、`12345.extern` 這種特殊 step 名稱）

    ---

    ## 常見誤解一次釐清

    ### 1) 「我已經有 sbatch 了，為什麼還要 step？」

    因為 sbatch 只是拿到 allocation + 跑你的腳本；你腳本裡要啟動多節點/多 task 的程式，通常靠 `srun`，而 `srun` 就是在建立/啟動 step。

    ### 2) 「step 可以跟 job 要不同資源嗎？」

    可以「**縮小/切片**」，但不能「超出」job allocation。

    * 例如 job 拿到 8 GPUs，某個 step 可以只用 2 GPUs
    * 但 step 不可能用到 10 GPUs（超過 allocation）

    ### 3) 「取消時差在哪？」

    * `scancel <jobid>`：整個 job（所有 steps）都砍掉
    * `scancel <jobid>.<stepid>`：只砍某個 step（其他 step 可能還在或之後還會跑）

    ---

    ## 一句話記法

    * **Job = 你跟 Slurm「訂到的資源套餐」**
    * **Step = 你在這套餐裡「按一次 srun 開跑的一次工作階段」**

    如果你願意貼一段你常用的 `sbatch` 腳本（或你在 login pod 裡的 `srun` 指令），我可以直接幫你把「哪裡是 job、哪裡會產生幾個 steps、各 step 會吃到哪些資源」逐行標註出來。

<br>

---

<br>

### User Associations：General / Limits / QoS / FairShare 的功能用途？
在 Slurm 系統中，Association (關聯) 是連通「使用者 (User)」、「帳號 (Account)」與「分割區 (Partition)」的橋樑。
這四個頁籤分別定義了該使用者在該帳號下能「做什麼」以及「能用多少」：
1. **General (一般設定)**
    - **功能**： 定義基礎的存取路徑。
    - **用途**： 確定這個使用者在哪個 **Cluster (叢集)** 以及哪個 **Partition (分割區/佇列)** 下可以使用這個 Account。如果你希望某個使用者在 A 專案只能用 general 佇列，而在 B 專案可以用 gpu 佇列，就在這裡設定。
2. **Limits (資源限制 / 配額)**
    - **功能**： 針對該「使用者 + 帳號」組合進行量化限制（TRES Limits）。
    - **用途**：
        - **GrpTRES (群組總量限制)**： 例如限制該使用者在此帳號下「總共」只能同時使用 100 顆 CPU 或 4 張 GPU。
        - **MaxJobs / MaxSubmit**： 限制此人同時能跑幾個任務，避免單一使用者瞬間塞滿調度器。
        - **MaxWall (時限)**： 限制單一任務的最長執行時間（例如不得超過 24 小時）。
3. **QoS (服務品質 - Quality of Service)**
    - **功能**： 定義任務的「特權級別」與「優先順序」。
    - **用途**：
        - **優先權 (Priority)**： 高 QoS 的任務會在排隊時自動排到前面。
        - **搶佔 (Preemption)**： 某些 QoS 允許高等級任務「踢掉」正在運行的低等級任務。
        - **限制豁免**： 某些 QoS 可能允許使用者暫時超越原本的 Limits 配額。
4. **FairShare (公平分配比重)**
    - **功能**： 設定調度演算法中的「權重（Shares）」。
    - **用途**：
        - **資源爭奪時的裁判**： 當多人同時排隊時，Slurm 會看誰的 FairShare 比較高。
        - **歷史補償**： 如果某個使用者最近都沒用系統（歷史用量低），他的優先級會自動提高；反之，近期瘋狂使用的使用者，其優先級會暫時降低。
        - **Raw Shares**： 你在這裡給的數字越大，代表該使用者在資源競爭時擁有的「發言權」越重。
- **總結來說：**
    - **General** 決定「能不能進門」。
    - **Limits** 決定「進門後能拿多少東西」。
    - **QoS** 決定「拿東西時能不能插隊」。
    - **FairShare** 決定「當大家都在排隊拿東西時，誰該優先」。

- ### Snapshot
    - ### General
        ![image](https://hackmd.io/_uploads/SkAxh1pEZg.png)
    - ### Limits
        ![image](https://hackmd.io/_uploads/SyIeakaE-e.png)
    - ### QoS
        ![image](https://hackmd.io/_uploads/HJXb6yTN-l.png)
    - ### FairShare
        ![image](https://hackmd.io/_uploads/HJ6ZTyaEWx.png)

<br>

{%hackmd vaaMgNRPS4KGJDSFG0ZE0w %}
