Slurm / Account
===
###### tags: `Slurm`
###### tags: `Slurm`, `HPC`, `Linux`, `Slinky`, `SlinkyProject`, `sacctmgr`, `scontrol`, `sinfo`, `srun`, `AllowGroups`, `AllowAccounts`, `Hidden`, `PrivateData`
<br>
[TOC]
<br>
# 介紹
## 簡介
**Slurm 的 account 是「專案/部門代號」**,拿來把作業資源用量「分帳、限額、排程加權、出報表」。它不是作業系統帳號,而是用來管理與統計的一層。
<br>
### 為什麼要設定 account
- **分帳與計費**:依專案/團隊彙總 CPU/GPU/記憶體耗用,做成本分攤或預算控管。
- **公平分配(FairShare)**:給不同 account 權重(Shares),排程時自動拉平長期資源使用差異。
- **配額與限制**:對 account 設 GrpTRES、MaxJobs、GrpTRESMins 等上限,避免單一團隊把機器吃光。
- **報表與稽核**:用 `sacct`/`sreport` 依 account 出月報、週報,追蹤效率與使用率。
- **權限與隔離**:限制某些 account 只能用特定 partition/QoS,或套用不同優先級。
- **生命週期管理**:專案開始/結束就開/關 account;人員移轉只要改其所屬 account。
<br>
### 最常見的操作:
```bash
# 建立專案帳(account)
sacctmgr add account eng Description="R&D Team" Organization="Company"
# 把使用者加到專案,並設預設專案帳
sacctmgr add user name=alice account=eng DefaultAccount=eng
# 設公平分配與群組資源上限(例:給 100 權重、10 萬 CPU 分鐘)
sacctmgr modify account name=eng set Fairshare=100 GrpTRESMins=cpu=100000
# 依專案看用量報表(8 月份)
sreport cluster AccountUtilization Start=2025-08-01 End=2025-08-31
# 查某專案作業細節
sacct -A eng -S 2025-08-01 -E now --format=JobID,User,Elapsed,CPUTime,TRESUsageInAve
```
**小提醒**:
- 要看到完整用量/報表,需同時正確設好 `AccountingStorageType=slurmdbd`、`JobAcctGatherType`(如 `linux` 或 `cgroup`),並讓 `slurmdbd` 正常連到資料庫。
<br>
---
<br>
## docs
- ### Accounting and Resource Limits
> https://slurm.schedmd.com/accounting.html
- [Account Options](https://slurm.schedmd.com/accounting.html#account-options)
- [User Options](https://slurm.schedmd.com/accounting.html#user-options)
- ### sacctmgr 指令
> https://slurm.schedmd.com/sacctmgr.html
- [[ENTITIES] association](https://slurm.schedmd.com/sacctmgr.html#OPT_association)
<br>
---
<br>
## 指令導讀
### 參數名稱和參數值,大小寫不敏感
```
$ sacctmgr list user
$ sacctmgr list USER
$ sacctmgr LIst usER
```

<br>
### auto-completion
> 按 `<tab>` 啟用自動完成
```
$ sacctmgr list + <tab>
account cluster event instance qos resource stat tres wckey
association configuration federation problem reservation runawayjobs transaction user
```

<br>
```
$ sacctmgr list a + <tab>
account association
```

<br>
### 支援同義詞:子指令(sub-command) 可互換
> **CRUD**: Create, Read, Update, Delete
- ### 建立:`sacctmgr [add|create]`
- `sacctmgr add` <-> `sacctmgr create`
- ### 查詢:`sacctmgr [list|show]`
- `sacctmgr list` <-> `sacctmgr show`
- ### 更新:`sacctmgr [modify|update]`
- `sacctmgr modify` <-> `sacctmgr update`
- ### 刪除:`sacctmgr [delete|remove]`
- `sacctmgr delete` <-> `sacctmgr remove`
<br>
### 等效子指令
- 如果 auto-completion 只有一種結果,**參數**可直接省去後面的輸入
```
$ sacctmgr list as + <tab> # -> sacctmgr list association
```
底下指令都能正常執行 (i.e. 等效指令):
- `$ sacctmgr list as`
- `$ sacctmgr list ass`
- `$ sacctmgr list asso`
- `$ sacctmgr list assoc`
- `$ sacctmgr list associ`
- `$ sacctmgr list associa`
- `$ sacctmgr list associat`
- `$ sacctmgr list associati`
- `$ sacctmgr list associatio`
- `$ sacctmgr list association`
- 同理:
- `$ sacctmgr show user tj witha`
- `$ sacctmgr show user tj withas`
- `$ sacctmgr show user tj withass`
<br>
### 變更設定
> Modifying Entities
> > https://slurm.schedmd.com/accounting.html
- ### 指令用法
```
sacctmgr modify <entity> set <options> where <options>
```
- ### 範例
```
sacctmgr modify user set default=none where default=test
```
- 會將所有預設帳戶為「test」的使用者,其預設帳戶改為「none」。
- 一旦有實體被新增、修改或移除,變更會傳送到相應的 Slurm 守護行程(daemons),並可立即生效使用。
<br>
<br>
## account 指令
### 列出 account
> 指令可互換:
> - `sacctmgr list account`
> - `sacctmgr show account`
```
$ sacctmgr list account
Account Descr Org
---------- -------------------- --------------------
admin admin group admin
eng engineering eng
games games games
res research res
root default root account root
tj-account tj exclusive tj-account
```
### 建立 account
> 指令可互換:
> - `sacctmgr add account`
> - `sacctmgr create account`
```
$ sacctmgr create account tj-account description='TJ Exclusive'
```
### 刪除 account
> 指令可互換:
> - `sacctmgr delete account`
> - `sacctmgr remove account`
```
$ sacctmgr delete account tj
$ sacctmgr delete account name=tj
```
<br>
<br>
## user 指令
### 列出 user
```
$ sacctmgr list user
$ sacctmgr show user
User Def Acct Admin
---------- ---------- ---------
admin1 admin Administ+
alice eng None
bob res None
root root Administ+
tj-1 None
```
<br>
### 列出 user (含關連資訊)
```
$ sacctmgr list user tj withassoc
$ sacctmgr show user tj withassoc
User Def Acct Admin Cluster Account Partition Share Priority MaxJobs MaxNodes MaxCPUs MaxSubmit MaxWall MaxCPUMins QOS Def QOS
---------- ---------- --------- ---------- ---------- ---------- --------- ---------- ------- -------- -------- --------- ----------- ----------- -------------------- ---------
tj tj-account None slurm tj-account 1 normal
```
<br>
### 列出 user (自定義欄位)
```
$ sacctmgr list user format=user,defaultaccount,acct,admin,cluster,partition,share
User Def Acct Account Admin Cluster Partition Share
---------- ---------- ---------- --------- ---------- ---------- ---------
admin1 admin Administ+
alice eng None
bob res None
root root Administ+
tj tj-account None
```
<br>
### 建立 user
```bash
$ sacctmgr create user tj account=tj-account cluster=slurm
# 等效用法:
$ ... create user name=tj ...
$ ... create user user=tj ...
```
- ### :warning: account 與 partition 建立關聯的必要步驟
### 說明
建立 account 時,需要攜帶 partition 參數,才會建立 account 與 partition 關聯,否則即便在 `slurm.conf` 中定義 `PartitionName ... AllowAccounts=tj-account` 資訊,仍然不會自動建立關聯
```
PartitionName=debug Nodes=e900 Default=NO MaxTime=UNLIMITED \
State=UP AllowAccounts=tj-account Hidden=YES
```
### 關聯設定過程:
```
$ sacctmgr add user name=tj account=tj-account partition=debug cluster=slurm
Adding User(s)
tj
Settings
Associations =
C = slurm A = tj-account U = tj P = debug
Would you like to commit changes? (You have 30 seconds to decide)
(N/y): y
$ sacctmgr show user tj withassoc
User Def Acct Admin Cluster Account Partition Share Priority MaxJobs MaxNodes MaxCPUs MaxSubmit MaxWall MaxCPUMins QOS Def QOS
---------- ---------- --------- ---------- ---------- ---------- --------- ---------- ------- -------- -------- --------- ----------- ----------- -------------------- ---------
tj tj-account None slurm tj-account debug 1 normal
```
<br>
### 建立登入帳號
```bash
# 在 login 節點 (或 login pod)
# 建立 Linux 帳號
# -m: 建立 home 目錄 -> /home/tj
# -s: 預設的 shell -> /bin/sh, /bin/bash ?
$ useradd tj -m -s /bin/bash
# 設定密碼
$ passwd tj
# 或直接導入密碼
$ echo "tj:123456" | chpasswd
```
<br>
### 刪除 user
```bash
$ sacctmgr delete user where user=tj
# 等效指令
$ sacctmgr delete user tj
# 備忘:相關用法
$ sacctmgr remove user name=tj account=tj-account cluster=slurm
```
<br>
### 更新 suer 屬性
```
$ sacctmgr update user david account=sys set partition=giove
```
- [Ticket 2024 - How to restrict user access to partitions](https://support.schedmd.com/show_bug.cgi?id=2024#:~:text=sacctmgr%20update%20user%20david%20account%3Dsys,set%20partition%3Dgiove)
### 參考資料
- [[slurm-users] Changing a user's default account](https://groups.google.com/g/slurm-users/c/w_NVWH5Fi6c)
<br>
<br>
## associations 指令
> [EXAMPLES](https://slurm.schedmd.com/sacctmgr.html#SECTION_EXAMPLES)
```
$ sacctmgr list associations cluster=slurm format=Account,Cluster,User,Fairshare tree withd
Account Cluster User Share
-------------------- ---------- ---------- ---------
root slurm 1
root slurm root 1
admin slurm 1
admin slurm admin1 1
eng slurm 1
eng slurm alice 1
eng slurm tj 1
games slurm 1
res slurm 1
res slurm bob 1
tj-account slurm 1
tj-account slurm tj 1
```
<br>
### `sacctmgr list associations` vs `sacctmgr list user withassoc`
```
$ sacctmgr list associations user=admin1
Cluster Account User Partition Share Priority GrpJobs GrpTRES GrpSubmit GrpWall GrpTRESMins MaxJobs MaxTRES MaxTRESPerNode MaxSubmit MaxWall MaxTRESMins QOS Def QOS GrpTRESRunMin
---------- ---------- ---------- ---------- --------- ---------- ------- ------------- --------- ----------- ------------- ------- ------------- -------------- --------- ----------- ------------- -------------------- --------- -------------
slurm admin admin1 1 normal
---
$ sacctmgr list user name=admin1 withassoc
User Def Acct Admin Cluster Account Partition Share Priority MaxJobs MaxNodes MaxCPUs MaxSubmit MaxWall MaxCPUMins QOS Def QOS
---------- ---------- --------- ---------- ---------- ---------- --------- ---------- ------- -------- -------- --------- ----------- ----------- -------------------- ---------
admin1 admin Administ+ slurm admin 1 normal
```
- `sacctmgr list associations` 不帶有 Def Acct 資訊 (Default Account)
<br>
---
---
<br>
# Q & A
## modify & update 指令
### 自動化注意事項
- `-i`, `--immediate`: commit changes immediately
直接跳過「**是否要提交變更?**」的互動確認,直接送出變更
- **簡單講**:**不確認有哪些變更,直接送出 commit**
- **用途**:適合自動化作業
- **備註**:
- 若本來就沒有需要提交的東西(例如 list/show、或 modify where ... 沒選到任何對象),加不加 -i 看起來就「沒差」。
<br>
## Troubleshooting
### 使用 modify & update 指令設定好,卻沒有效果?
- ### 問題:設定上沒有同步,或有延遲
- ### 解法:先把控制器強制刷新
- ### K8s 環境/Slinky operator
```bash
# 讓控制器重讀設定與快取
kubectl -n slurm exec pod/slurm-controller-0 -- scontrol reconfigure
```
或是:
- 在 login 節點、compute 節點等,能執行 `scontrol` 指令的地方
都適合執行 `scontrol reconfigure`
- 能執行 `scontrol` 指令的地方都適合
<br>
---
---
<br>
# 🎯 教學目標1
1. 為不同使用者設計可隔離的運算資源 (Partition)。
2. 透過 Slurm 的帳號(Account)機制將使用者與資源對應。
3. 實作管理者帳號,擁有全域可見與控制權限。
4. 驗證不同使用者看到的 partition 是否正確,並能否成功提交作業。
<br>
---
## 🧑🏫 教學場景設定
| 身份 | Slurm 使用者名<br>(name) | 所屬帳號<br>(account) | 權限角色<br>(AdminLevel) | 可用運算資源<br> (Partition) |
| ---- | ---------- | ------- | -------- | ------------- |
| 管理者1 | `admin1` | `admin` | AdminLevel=Admin | 所有 partitions |
| 管理者2 | `admin2` | `admin` | AdminLevel=Admin | 所有 partitions |
| 工程部門 | `alice` | `eng` | 一般使用者 | `eng`, `shared` |
| 研究部門 | `bob` | `res` | 一般使用者 | `res`, `shared` |
<br>
---
## 🧱 Partition 規劃
```slurm.conf(片段):
PartitionName=eng Nodes=node[0-1] Default=NO MaxTime=INFINITE State=UP AllowAccounts=eng
PartitionName=res Nodes=node[2-3] Default=NO MaxTime=INFINITE State=UP AllowAccounts=res
PartitionName=shared Nodes=node[0-3] Default=YES MaxTime=INFINITE State=UP AllowAccounts=ALL
```
- 留意新增參數 `AllowAccounts`
- [[doc] PARTITION CONFIGURATION](https://slurm.schedmd.com/slurm.conf.html#SECTION_PARTITION-CONFIGURATION)
> https://slurm.schedmd.com/slurm.conf.html
>
| 屬性 | 預設值 | 值清單 |
|-----|-------|-------|
| [PartitionName](https://slurm.schedmd.com/slurm.conf.html#OPT_PartitionName) |
| [Nodes](https://slurm.schedmd.com/slurm.conf.html#OPT_Nodes_1)
| [Default](https://slurm.schedmd.com/slurm.conf.html#OPT_Default) | `NO` | `YES`, `NO` |
| [MaxTime](https://slurm.schedmd.com/slurm.conf.html#OPT_MaxTime)
| [State](https://slurm.schedmd.com/slurm.conf.html#OPT_State_2) | `UP` | `UP`, `DOWN"`, `DRAIN`, `INACTIVE` |
| [AllowAccounts](https://slurm.schedmd.com/slurm.conf.html#OPT_AllowAccounts) | `ALL` | 允許多值,以逗號(`,`)區隔 |
<br>
---
<br>
## 🔧 設定步驟
> - `sacctmgr` 支援 tab auto-completion,按 `[tab]` 就能顯示可用參數
> 
<br>
### 步驟 1:建立帳號(Account)
> - 建立組織單位(或專案名稱),不是個人帳號
> - 每個 account 下,可在建立多個 user (小號, 個人帳號)
```bash
sacctmgr add account eng Description="Engineering"
sacctmgr add account res Description="Research"
sacctmgr add account admin Description="Admin Group"
```
- 子指令 `add account` or `create account` 可互換
- account 名稱,可包含 `-` (dash),如 `admin-1`, `admin-2`
- 建立完後,可用底下指令查看:
```bash
$ sacctmgr list account
$ sacctmgr show account
Account Descr Org
---------- -------------------- --------------------
admin admin group admin
eng engineering eng
res research res
root default root account root
```
- 子指令 `list account` or `show account` 可互換
<br>
---
### 步驟 2:建立使用者(user),並關聯到帳號(Account)
> - 定義某個組織單位(或專案名稱)中,有哪些成員?
```bash
sacctmgr add user name=admin1 cluster=slurm account=admin AdminLevel=Admin
sacctmgr add user name=admin2 cluster=slurm account=admin AdminLevel=Admin
sacctmgr add user name=alice cluster=slurm account=eng
sacctmgr add user name=bob cluster=slurm account=res
```
- 子指令 `add user` or `create user` 可互換
- 如果只有一個 cluster,`cluster` 參數可忽略
<br>
---
### 步驟 3:設定 Account 的計算資源(partition)
> - partition 的另類說法,就是「**資源池**」
> - 設定 partition 可以讓哪些 account (組織單位) 存取
```bash
# 確保這些內容存在於 slurm.conf 或 Helm 的 values.yaml 中
PartitionName=eng Nodes=node[0-1] AllowAccounts=eng Default=NO MaxTime=INFINITE State=UP
PartitionName=res Nodes=node[2-3] AllowAccounts=res Default=NO MaxTime=INFINITE State=UP
PartitionName=shared Nodes=node[0-3] AllowAccounts=ALL Default=YES MaxTime=INFINITE State=UP
```
- **關於 partition**
- 相關指令
```
$ sinfo
$ scontrol show partition [-a]
```
- `admin1`, `admin2` 是管理者帳號,擁有完整權限,可以看到所有 partition 和 job。
- user 可以看到其他 partition 資訊,只是無法提交任務
- **關於 SlinkyProject 的設定方式**
Slinky 中如使用 Helm,請透過 `compute.partitions[*].config.AllowAccounts` 欄位進行設定。
```
compute
partitions:
- name: all
...
# -- (map[string]string | map[string][]string)
# Extra Slurm partition configuration appended onto the partition line.
# Ref: https://slurm.schedmd.com/slurm.conf.html#lbAI
config:
State: UP
Default: "YES"
MaxTime: UNLIMITED
AllowAccounts: eng
```
- **關於隱藏 partition**
- `Hidden=[YES|NO]`
- 如果要隱藏某個 partition,可額外添加 `Hidden=YES` 設定。
```conf
# slurm.conf
PartitionName=eng Nodes=node[0-1] AllowAccounts=eng Hidden=YES Default=NO MaxTime=INFINITE State=UP
```
- **視覺上隔離,非物理上隔離**。
- 一般 user 可下 `-a` 參數顯示(看得到,吃不到)
```
$ scontrol show partition -a
```
- 對應的效果
| 指令 | 對於某個 partition ,沒有存取權限的 user ,其效果如下: |
|-----|-----|
| `$ sinfo` | 沒有存取權限的 partition -> 被隱藏起來 |
| `$ sinfo -a` | 沒有存取權限的 partition -> **可以看到** |
| `$ scontrol show partition` | 沒有存取權限的 partition -> 被隱藏起來 |
| `$ scontrol show partition -a` | 沒有存取權限的 partition -> **可以看到** |
| `$ cat /run/slurm/conf/slurm.conf` | 可看到 partition 設定
| `$ sacctmgr show account` | 仍然可看到其它 account |
| `$ sacctmgr show user` | 仍然可看到其他 user |
<br>
---
### 步驟 4:啟用限制檢查
在 `slurm.conf` 中加入:
```conf
AccountingStorageEnforce=associations
EnforcePartLimits=ALL
```
- 這樣 Slurm 才會根據 AllowAccounts/使用者帳號設定進行限制。
- `EnforcePartLimits=ALL`
讓 Slurm 在提交作業時就檢查 Partition 的各項限制,包括 `AllowAccounts`, `AllowGroups` 等
<br>
---
### 步驟 5:在 login 節點,建立對應 user 的 Linux 帳號
```bash
$ ssh root@127.0.0.1 -p 32222 # 進入到 login 節點
# -m: 建立 home 目錄 (/home/admin1)
# -s: 使用 `/bin/bash`,而不是 `/bin/sh`
root@slurm-login-6fb5d948d6-5mcvp:~# useradd admin1 -m -s /bin/bash
root@slurm-login-6fb5d948d6-5mcvp:~# passwd admin1
New password:
BAD PASSWORD: The password is shorter than 8 characters
# 同理:建立底下 user
# $ useradd admin2 -m -s /bin/bash
# $ passwd admin2
#
# $ useradd alice -m -s /bin/bash
# $ passwd alice
#
# $ useradd bob -m -s /bin/bash
# $ passwd bob
```
- 建立完 Linux 帳號後,使用 `admin1`, `alice` 帳號連線測試:
```
$ ssh admin1@127.0.0.1 -p 32222 # 進入到 login 節點
$ ssh alice@127.0.0.1 -p 32222 # 進入到 login 節點
```
- `admin1`

- `alice`

---
## ✅ 測試任務
| 測試人 | 指令 | 預期結果 |
| ------ | ---------------------- | -------------------------- |
| alice | `sinfo` | 只能看到 `eng`, `shared` |
| bob | `sinfo` | 只能看到 `res`, `shared` |
| admin1 | `sinfo` | 可以看到全部三個 partitions |
| bob | `sbatch -p eng job.sh` | **被拒絕**,因 bob 所屬帳號不是 eng |
| alice | `sbatch -p res job.sh` | **被拒絕**,因 alice 所屬帳號不是 res |
| admin1 | `sbatch -p res job.sh` | **成功**,管理員可繞過 partition 限制 |
---
## 🎓 延伸學習
* 利用 `sacctmgr list association format=user,account,adminlevel` 檢查權限分布
* 若結合 LDAP,可定期同步群組對應 Slurm 帳號
* 可用 `scontrol show job <jobid>` 來確認作業被分配的 Partition 和帳號
* 可設計 `shared` Partition 有限資源,鼓勵使用者使用自己專屬 Partition
<br>
---
---
<br>
# 延伸議題
## partition 可見性
### AdminLevel
- ### docs
- [AUTHORIZATION](https://slurm.schedmd.com/scontrol.html#SECTION_AUTHORIZATION)
> 提到三個角色 Operator, Admin, coordinators
- scontrol create partition: Admin
- scontrol show partition: Admin, Operator
- scontrol update partition: Admin
- scontrol delete partition: Admin
<br>
### [partition] attribute: Hidden?
- ### forums
- [[slurm-users] How to use partition option "Hidden"?](https://groups.google.com/g/slurm-users/c/31_C9tjmfY8)
<br>
### [partition] attribute: AllowGroups?
- ### forums
- [How does one configure SLURM groups to limit access to partitions?](https://ask.cyberinfrastructure.org/t/how-does-one-configure-slurm-groups-to-limit-access-to-partitions/39/1)
```
PartitionName=xyzPartition Nodes=compute[001-010] Priority=1000 AllowGroups=xxxMioNodes, yyyMioNodes, zzzMioNodes
```
- ### logs
- AllowGroups 如果不存在,有底下錯誤:
在 ‵slurm.conf‵ 中設定 ‵AllowGroups=eng‵
```
# slurm.conf
PartitionName=debug Nodes=e900 Default=NO MaxTime=UNLIMITED State=UP AllowGroups=eng AllowAccounts=eng Hidden=YES
```
controller node 中,groups 如果沒有 eng,會有底下錯誤:
```
ocisadmin@ocis-esc4000a-e11:~$ k logs pod/slurm-controller-0 | grep 'not find'
[2025-07-25T10:13:01.855] error: _get_group_members: Could not find configured group eng
[2025-07-25T10:13:04.788] error: _get_group_members: Could not find configured group eng
```
<br>
### [slurm.conf] attribute: PrivateData?
- ### docs
- [[scontrol] AUTHORIZATION](https://slurm.schedmd.com/scontrol.html#SECTION_AUTHORIZATION)
- [[slurm.conf] PrivateData](https://slurm.schedmd.com/slurm.conf.html#OPT_PrivateData)
- ### 設定方式
```
# slurm.conf
PrivateData=accounts,users,partitions,nodes
```
- ### logs
```
tj@slurm-login-6fb5d948d6-d9xh6:~$ scontrol show partitions
slurm_load_partitions error: Access/permission denied
tj@slurm-login-6fb5d948d6-d9xh6:~$ sacctmgr show account
Account Descr Org
---------- -------------------- --------------------
admin admin group admin
eng engineering eng
games games games
res research res
root default root account root
tj-account tj exclusive tj-account
tj@slurm-login-6fb5d948d6-d9xh6:~$ sacctmgr show user
User Def Acct Admin
---------- ---------- ---------
admin1 admin Administ+
alice eng None
bob res None
root root Administ+
tj tj-account None
```
<br>
{%hackmd vaaMgNRPS4KGJDSFG0ZE0w %}