Slurm / Partition
===
###### tags: `Slurm`
###### tags: `Slurm`, `HPC`, `Linux`, `Slinky`, `SlinkyProject`, `Partition`, `scontrol create partitionname`, `sacctmgr`, `scontrol`, `slurm.conf`, `AllowGroups`, `AllowAccounts`, `Hidden`, `PrivateData`
<br>
[TOC]
<br>
## 如何套用設定?
- 修改 `slurm.conf` -> `$ scontrol reconfigure`
- `$ scontrol create/add ...` -> 立即生效
- `$ scontrol modify/updae ...` -> 立即生效
<br>
## 動態新增 partition
```
$ scontrol create \
partitionname=debug \
nodes=esc8000a-[0-1] \
Default=NO \
MaxTime=UNLIMITED \
State=UP
$ scontrol show partitions
PartitionName=tn
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=0 LLN=NO MaxCPUsPerNode=UNLIMITED MaxCPUsPerSocket=UNLIMITED
NodeSets=esc8000b
Nodes=esc8000b-0
PriorityJobFactor=1 PriorityTier=1 RootOnly=NO ReqResv=NO OverSubscribe=NO
OverTimeLimit=NONE PreemptMode=OFF
State=UP TotalCPUs=80 TotalNodes=1 SelectTypeParameters=NONE
JobDefaults=(null)
DefMemPerNode=UNLIMITED MaxMemPerNode=UNLIMITED
TRES=cpu=80,mem=240G,node=1,billing=80,gres/gpu=8
PartitionName=debug
AllowGroups=ALL AllowAccounts=ALL AllowQos=ALL
AllocNodes=ALL Default=NO 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=esc8000a-[0-1]
PriorityJobFactor=1 PriorityTier=1 RootOnly=NO ReqResv=NO OverSubscribe=NO
OverTimeLimit=NONE PreemptMode=OFF
State=UP TotalCPUs=24 TotalNodes=2 SelectTypeParameters=NONE
JobDefaults=(null)
DefMemPerNode=UNLIMITED MaxMemPerNode=UNLIMITED
TRES=cpu=22,mem=480G,node=2,billing=22,gres/gpu=2
$ srun -p debug hostname
esc8000a-1
$ srun -p debug nvidia-smi -L
GPU 0: NVIDIA A40 (UUID: GPU-35729da9-1b69-c8f6-9f22-************)
GPU 1: NVIDIA A40 (UUID: GPU-157a6555-49d1-07bc-bf97-************)
GPU 2: NVIDIA A40 (UUID: GPU-14c00e59-b533-e691-f568-************)
GPU 3: NVIDIA A40 (UUID: GPU-228d9110-2bf1-6707-1afe-************)
GPU 4: NVIDIA A40 (UUID: GPU-755ec026-8359-581c-b638-************)
GPU 5: NVIDIA A40 (UUID: GPU-960a7fde-5e36-47d9-64e0-************)
GPU 6: NVIDIA A40 (UUID: GPU-9c40d7e3-7322-d916-c6a9-************)
GPU 7: NVIDIA A40 (UUID: GPU-b42813b5-fbfe-100d-d062-************)
```
<br>
---
---
<br>
## `scontrol update partitionname=<name>`
```
# 1. 設定 partition 的預設記憶體限制
scontrol update partitionname=cpu-set defmempernode=1024
# 2. 調整節點的 MemSpec 限制(釋放更多可用記憶體)
scontrol update nodename=c2m4-0 memspeclimit=0
# 3. 驗證配置
scontrol show partition cpu-set | grep DefMemPerNode
scontrol show node c2m4-0 | grep MemSpec
```
<br>
## 常見操作
### 解除 drain
```bash
$ sinfo
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
cpu-set* up infinite 1 drain c2m4-0
$ scontrol update NodeName=c2m4-0 State=RESUME
# 順便清掉原因
scontrol update NodeName=ocis-c8m16-0 State=RESUME Reason=""
```
- 不是解除 drain 的作法
```
$ scontrol update PartitionName=cpu-set State=UP
```
- 建議先查 drain 原因(避免 RESUME 後又馬上被 drain)
```bash
$ scontrol show node ocis-c8m16-0
# 或
$ sinfo -R
```
<br>
---
---
<br>
## 討論
### Partition / AllowGroups 設定限制分析
- ### Question
```
# slurm.conf
PartitionName=debug Nodes=e900 Default=NO MaxTime=UNLIMITED State=UP AllowGroups=tj-group AllowAccounts=tj-account
```
一個 partition 設置了 `AllowGroups=tj-group`
- login, controller, compute 等相關節點,需要如何進行設定?
- 對使用者來說有什麼限制?
- ### gpt-5 (2025/08/29)
以下用你這段設定為例:
```
PartitionName=debug Nodes=e900 Default=NO MaxTime=UNLIMITED State=UP \
AllowGroups=tj-group AllowAccounts=tj-account
```
### 叢集各節點需要怎麼設
* **slurm.conf 要一致**:`slurm.conf` 必須在 **controller、login、compute** 等所有節點完全一致(含這條 partition 設定)。改完在 controller 執行 `scontrol reconfigure` 套用即可,變更允許的帳號/群組**不用**重啟 slurmd。 ([Niflheim][1], [SchedMD][2])
* **建立/同步 UNIX 群組**:在你的**身分來源**(/etc/group、LDAP/SSSD、AD…)建好 `tj-group`,並把允許的使用者加進去。**重點**:`slurmctld`(controller)會根據本機可查到的群組成員快取來判斷是否允許,確保在 **controller** 上 `id <user>` 能看到 `tj-group`。群組成員名單的更新與快取由 `GroupUpdateTime/GroupUpdateForce` 控制。 ([Slurm][3], [Debian Manpages][4])
* **Slurm 帳號關聯**:因為有 `AllowAccounts=tj-account`,你還要在 Slurm DB 內把使用者關聯到 `tj-account`(`sacctmgr add/modify user ... account=tj-account`)。否則帳號不被允許。 ([Slurm][5], [JHPCE][6])
* **立即在提交時擋下(建議)**:在 `slurm.conf` 加上 `EnforcePartLimits=ALL`,不符 partition 限制(含 AllowGroups/AllowAccounts)的工作會在 **提交當下**被拒絕;若未啟用,工作只會排隊但無法被排程。 ([Slurm][3])
> 小提醒
>
> * 若同時設定 `AllowAccounts` 與 `DenyAccounts`,前者會蓋過後者;partition 沒有 `DenyGroups` 選項。 ([Slurm][5], [Server Fault][7])
<br>
### 對使用者的具體限制與行為
* **門檻是 AND 條件**:要能在 `debug` 跑工作,使用者必須 **同時**屬於 UNIX 群組 `tj-group` **且** 其 Slurm 帳號屬於 `tj-account`;這兩者都是 partition limit,會被強制檢查。 ([Slurm][3])
* **提交指令範例**:
* 若預設帳號不是 `tj-account`,需明確指定:`srun -p debug -A tj-account hostname`。不然可能見到 `Reason=AccountNotAllowed`。 ([Google Groups][8])
* 若不是 `tj-group` 成員,提交時會得到錯誤:`User's group not permitted to use this partition`。 ([Google Groups][9])
* **管理者例外**:具 Slurm Admin/Operator 權限的人在部分限制上可有管理性例外(例如修改工作屬性等)。 ([Slurm][10])
<br>
### 快速自檢清單
1. `scontrol show partition debug | egrep 'Allow|Nodes|State'`:確認 AllowAccounts/AllowGroups 生效。 ([Slurm][5])
2. 在 **controller**:`id <user>` / `getent group tj-group`:確認群組成員同步無誤(等 `GroupUpdateTime` 或 `scontrol reconfigure` 後再試)。 ([Slurm][3])
3. `sacctmgr list associations user=<user>`:確認使用者與 `tj-account` 的關聯存在。 ([JHPCE][6])
4. `squeue -j <jobid> -o "%i %P %r"`:若被擋,從 Reason 診斷(如 `AccountNotAllowed` / group not permitted)。 ([Google Groups][8])
這樣設定下來,就能以 **UNIX 群組**(`tj-group`)+ **Slurm 帳號**(`tj-account`)雙重條件,精準控管誰能用 `debug` 這個 partition。
[1]: https://niflheim-system.readthedocs.io/en/latest/Slurm_configuration.html?utm_source=chatgpt.com "Slurm configuration — Niflheim 24.07 documentation"
[2]: https://bugs.schedmd.com/show_bug.cgi?id=6306&utm_source=chatgpt.com "6306 – Enabling new partition for all users"
[3]: https://slurm.schedmd.com/slurm.conf.html?utm_source=chatgpt.com "Slurm Workload Manager - slurm.conf"
[4]: https://manpages.debian.org/testing/slurm-client/slurm.conf.5.en.html?utm_source=chatgpt.com "slurm.conf(5) — slurm-client — Debian testing"
[5]: https://slurm.schedmd.com/scontrol.html?utm_source=chatgpt.com "scontrol - Slurm Workload Manager"
[6]: https://jhpce.jhu.edu/slurm/tips-sacctmgr/?utm_source=chatgpt.com "sacctmgr tips"
[7]: https://serverfault.com/questions/617081/how-to-use-both-allowgroups-and-allowusers-in-sshd-config?utm_source=chatgpt.com "ssh - How to use both AllowGroups and AllowUsers in ..."
[8]: https://groups.google.com/g/slurm-users/c/mJwvyZGFt4w?utm_source=chatgpt.com "[slurm-users] Problem with assigning user to partition"
[9]: https://groups.google.com/g/slurm-users/c/RWsMyD21Xcc?utm_source=chatgpt.com "[slurm-users] AllowGroups for Partition not working?"
[10]: https://slurm.schedmd.com/user_permissions.html?utm_source=chatgpt.com "User Permissions - Slurm Workload Manager - SchedMD"
<br>
---
- ### DeepWiki (2025/08/29)
> https://deepwiki.com/search/-slurmconf-partitionnamedebug_93d101fc-912c-4a61-8b2f-c62b28853a9a
>
根據您的問題,我來詳細說明 SLURM 中 partition 設置 `AllowGroups=tj-group` 的相關設定和限制:
### 節點設定要求
**所有節點都需要相同的配置文件:**
所有的 login、controller、compute 節點都必須使用相同的 `slurm.conf` 配置文件。 [1](#0-0)
**各類型節點的服務配置:**
- Controller 節點:需要啟用 `slurmctld` 服務
- Compute 節點:需要啟用 `slurmd` 服務
- Login 節點:通常只需要安裝 Slurm 客戶端工具 [2](#0-1)
### AllowGroups 參數功能
`AllowGroups` 參數用於識別哪些使用者群組可以使用該 partition。可以指定多個群組,使用逗號分隔的列表。如果要允許所有群組使用該 partition,需要指定 "AllowGroups=ALL"。 [3](#0-2)
### 對使用者的限制
**群組成員資格檢查:**
當 partition 設置了 `AllowGroups=tj-group` 時,系統會執行以下檢查:
1. 如果 `allow_groups` 為 NULL,則所有使用者都被允許
2. 如果使用者是 Slurm 超級使用者,則允許在任何地方執行
3. 系統會檢查使用者是否在允許的群組列表中 [4](#0-3)
**實際限制效果:**
- 只有屬於 `tj-group` 的使用者才能向該 partition 提交作業
- 不屬於該群組的使用者嘗試提交作業時會被拒絕
- 系統會快取失敗的權限檢查結果 5 秒鐘以提高效能 [5](#0-4)
**群組驗證機制:**
系統會解析 `allow_groups` 中的群組名稱(以逗號分隔),並檢查使用者的主要群組是否在允許的群組列表中。 [6](#0-5)
### Notes
- 所有節點必須同步使用者和群組資訊(UIDs 和 GIDs)以確保權限檢查正確運作
- 如果使用大型的使用者/群組資料庫,建議停用使用者/群組枚舉功能以避免對目錄服務器造成負載
- 權限檢查會在作業提交時進行,而不是在節點執行時才檢查
- 此設定與 `AllowAccounts`(Slurm 帳戶實體)不同,`AllowGroups` 是針對 UNIX 系統群組的限制
<br>
---
- ### mycoder_bot / Claude 3.7 Sonnet (2025/08/29)
根據研究,我整理出關於 Slurm `AllowGroups` 設定的資訊:
### 節點設定要求
1. **控制節點 (Controller Node):**
- 需在 `slurm.conf` 中設定分區的 AllowGroups
- 需有存取群組資料庫的權限(LDAP、本地檔案等)
- 可配置 `GroupUpdateTime` 參數控制群組資訊更新頻率
2. **計算節點 (Compute Node):**
- 需與控制節點同步相同的 `slurm.conf` 配置
- 需有同步的使用者/群組資料庫
- 不需特別針對 AllowGroups 進行額外設定
3. **登入節點 (Login Node):**
- 需有對 `slurm.conf` 的唯讀存取權
- 不需額外設定,僅使用客戶端命令
### 使用者限制
1. **作業提交限制:**
- 不屬於指定群組的使用者無法提交作業到該分區
- 提交失敗時會顯示錯誤:「User's group not permitted to use this partition」
2. **可見性限制:**
- 預設情況下,未授權使用者看不到設有 AllowGroups 限制的分區
- 在 `sinfo` 輸出中不會顯示這些分區
- 此機制非完全安全性措施,若使用者知道分區名稱仍可查詢特定資訊
3. **特殊使用者例外:**
- Root 使用者:不受 AllowGroups 限制
- SlurmUser:不受 AllowGroups 限制
- Slurm 管理員/操作員:可查看任何分區資訊
4. **與 AllowAccounts 的關係:**
- 兩種限制獨立執行
- 使用者必須同時滿足 AllowGroups 和 AllowAccounts 的要求
- 若設置 AllowAccounts,則 DenyAccounts 設定會被忽略
以您提供的設定為例:
```
PartitionName=debug Nodes=e900 Default=NO MaxTime=UNLIMITED State=UP AllowGroups=tj-group AllowAccounts=tj-account
```
這表示只有屬於 `tj-group` 群組且使用 `tj-account` 帳戶的使用者才能提交作業到 debug 分區。
<br>
---
### 在建立完 slurm cluster 後,是否能能動態新增 partition?
- ### gpt-5 (2025/09/08)
可以!而且不需要重建整個叢集。
下面給你兩條路:**立即生效(臨時)** 與 **永久生效(建議)**。兩者都不會中斷現有工作。
---
### A) 立即生效:用 `scontrol` 動態新增/調整 Partition
> 適合先測,之後再把設定寫回 `slurm.conf`。
```bash
# 1) 在 slurmctld 節點/Pod 內執行(或能連到 slurmctld 的主機)
scontrol create PartitionName=tn Nodes=e900[1-2] Default=NO MaxTime=UNLIMITED State=UP
# 2) 檢查
scontrol show partition tn
sinfo -p tn
# 3)(可選)限制可用帳號/群組
scontrol update PartitionName=tn AllowAccounts=tn
# 或
scontrol update PartitionName=tn AllowGroups=tn-group
```
**注意**
* `scontrol create/update` 屬於**即時配置**,重讀 `slurm.conf`(或 slurmctld 重啟)時可能被覆蓋。所以確認可用後,請做 B 流程把設定寫回檔案。
* 變更節點清單時,`Nodes=...` 會以你提供的清單為準,等同覆寫;請給完整清單。
---
### B) 永久生效(建議):修改 `slurm.conf` + `reconfigure`
> 在 K8s(Slinky/Helm)通常是改 ConfigMap 或 Helm values 中的 `slurm.conf` 片段,然後重載。
1. 在 `slurm.conf` 增加(或調整)一行:
```conf
PartitionName=tn Nodes=e900[1-2] Default=NO MaxTime=UNLIMITED State=UP AllowAccounts=tn
```
2. 套用後**重載**(不會中斷現有工作):
```bash
# 進入 slurmctld Pod
kubectl -n slurm exec -it <slurmctld-pod> -- scontrol reconfigure
# 檢查
kubectl -n slurm exec -it <slurmctld-pod> -- scontrol show partition tn
```
> 如果你用 Helm 管理,更新 values 後 `helm upgrade`,控制器起來後再 `scontrol reconfigure` 即可。
---
### (若啟用會計/關聯)把人/帳號綁到新 Partition
你的環境若設定 `AccountingStorageEnforce=associations`(常見),需要建立關聯,否則使用者會無法送到新 partition:
```bash
# 建 account(若尚未)
sacctmgr create account name=tn
# 建使用者並綁定 account(舉例)
sacctmgr create user name=alice account=tn
# 建立 partition 關聯(很重要)
sacctmgr create assoc account=tn cluster=slurm partition=tn
#(可選)把預設帳號設為 tn
sacctmgr modify user name=alice set DefaultAccount=tn
# 驗證
sacctmgr list assoc where account=tn
```
---
### 測試
```bash
sinfo -p tn
srun -p tn -A tn -N1 -n1 hostname
```
---
### 下架/移除
* 臨時下架:`scontrol update PartitionName=tn State=DOWN` 或 `Hidden=YES`
* 永久移除:從 `slurm.conf` 刪除該行後 `scontrol reconfigure`(必要時先確保沒有作業在該 partition)
---
### 常見坑位
* **節點名稱對不上**:`Nodes=` 必須匹配 `slurmd` 的 `NodeName`/HostName(用 `scontrol show nodes` 看實名)。
* **忘了關聯**:啟用 association 強制時,沒建 `assoc` 會報提交錯誤。
* **被覆蓋**:用 `scontrol` 測完卻沒寫回 `slurm.conf`,下一次 reconfigure/重啟就失效。
需要我根據你目前的節點命名(例如 `e900[1-4]`、`a40[1-2]`)幫你寫一條精準的 `PartitionName=` 行嗎?我也可以順手給你對應的 `sacctmgr` 指令組合。
<br>
{%hackmd vaaMgNRPS4KGJDSFG0ZE0w %}