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 ``` ![](https://hackmd.io/_uploads/ByjYXVhtgg.png) <br> ### auto-completion > 按 `<tab>` 啟用自動完成 ``` $ sacctmgr list + <tab> account cluster event instance qos resource stat tres wckey association configuration federation problem reservation runawayjobs transaction user ``` ![image](https://hackmd.io/_uploads/rJVl2WoFex.png) <br> ``` $ sacctmgr list a + <tab> account association ``` ![image](https://hackmd.io/_uploads/Sy8ipWstxl.png) <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]` 就能顯示可用參數 > ![](https://hackmd.io/_uploads/rkzyWOkDxl.png) <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` ![](https://hackmd.io/_uploads/BkGdZWnFgg.png) - `alice` ![](https://hackmd.io/_uploads/SJsKZb2Fge.png) --- ## ✅ 測試任務 | 測試人 | 指令 | 預期結果 | | ------ | ---------------------- | -------------------------- | | 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 %}