---
# System prepended metadata

title: Slurm / Partition
tags: [scontrol, Partition, scontrol create partitionname, Slurm, Linux, slurm.conf, Slinky, AllowGroups, PrivateData, SlinkyProject, AllowAccounts, sacctmgr, HPC, Hidden]

---

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