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 %}