[Account] Account === ###### tags: `Slurm / Account` ###### tags: `Slurm`, `HPC`, `Linux`, `Slinky`, `SlinkyProject`, `slurmdb`, `Account`, `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> ## [非常重要] 指令導讀 ### [重要觀念] Slurm 的資料模型: - **User 和 Account 是全域資源(不屬於特定 cluster)** - 執行 add / modify / delete 指令不需加 `cluster=<cluster-name>` 參數 - 加了 `cluster=<cluster-name>` 參數,只是變成操作 association,全域的資料還在 - **Association 是 cluster-specific 的資源** - 執行指令需加 `cluster=<cluster-name>` 參數 <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 [add|create] [account|cluster|coordinator|federation|qos|resource|user] ...` - ### 查詢:`sacctmgr [list|show]` - `sacctmgr list` <-> `sacctmgr show` - `sacctmgr [list|show] [account|association|cluster|configuration|event|federation|instance|problem|qos|reservation|resource|runawayjobs|stat|transaction|tres|user|wckey] ...` - ### 更新:`sacctmgr [modify|update]` - `sacctmgr modify` <-> `sacctmgr update` - `sacctmgr [modify|update] [account|cluster|federation|qos|resource|user] ...` - 沒有 `association|coordinator|job` 表格 - ### 刪除:`sacctmgr [delete|remove]` - `sacctmgr delete` <-> `sacctmgr remove` - `sacctmgr [delete|remove] [account|cluster|coordinator|federation|qos|resource|user] ...` - 沒有 `association` 表格 <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` - `withassoc` 參數亦可改用 `--as`, `--ass` .. `--association` 參數 <br> ### 輸出設定 - ### 指定特定欄位輸出 - ### 指令用法 ``` sacctmgr [list|show] ... format=欄位1,欄位2,欄位3 ``` - ### 範例 ``` $ sacctmgr show association where user=tj_tsai format=cluster,account,partition,user # 可忽略 where 關鍵字 $ sacctmgr show association user=tj_tsai format=cluster,account,partition,user ``` - ### 放寬欄位寬度 - ### 指令用法 ``` sacctmgr [list|show] ... format=欄位1%10,欄位2%20,欄位3%30 ``` - ### 範例 ``` $ sacctmgr show association where user=tj_tsai format=cluster%10,account%20,user%30 Cluster Account User ---------- -------------------- ------------------------------ slurm_slu+ administrator tj_tsai slurm_slu+ tj1-project tj_tsai slurm_slu+ tj2-project tj_tsai slurm_slu+ tj3-project tj_tsai ``` - `Cluster` 寬度 10 個字元 - `Account` 寬度 20 個字元 - `User` 寬度 30 個字元 <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> ### sacctmgr 常用參數 - ### 情境:顯示 user 與 account 的關聯 - ### 使用 `--as` ~ `--associations`, `withas` ~ `withassoc` - `-s` or `--associations`: equivalent to "associations" command - ### command 形式 ``` sacctmgr [show|list] associations ``` - when using show/list will list the associations associated with the entity. - Accounts=, Clusters=, Flags=, Format=, ID=, OnlyDefaults, Partitions=, Parent=, Tree, Users=, WithSubAccounts, WithDeleted, WOLimits, WOPInfo, and WOPLimits - ### 情境:執行 `sacctmgr` 不需要做互動或確認,直接執行 - ### 關閉互動選項 > https://slurm.schedmd.com/sacctmgr.html#OPT_immediate > - `-i`, `--immediate` Commit changes immediately without asking for confirmation. - ### 情境:應用程式如何解讀 `sacctmgr` 所輸出的資料? - ### 使用 `|` 分隔,供程式剖析用 > https://slurm.schedmd.com/sacctmgr.html#OPT_parsable > - `-p`, `--parsable` Output will be '|' delimited with a '|' at the end. - `-P`, `--parsable2` Output will be '|' delimited without a '|' at the end. - ### 執行範例 ``` $ sacctmgr show account -p Account|Descr|Org| root|default root account|root| tn|tn|tn| tp|tp|tp| $ sacctmgr show account -P Account|Descr|Org root|default root account|root tn|tn|tn tp|tp|tp ``` - ### 情境:不顯示標題 - ### 不顯示標題 > https://slurm.schedmd.com/sacctmgr.html#OPT_noheader > - `-n`, `--noheader` no header will be added to the beginning of output - ### 執行範例 ``` $ sacctmgr show account Account Descr Org ---------- -------------------- -------------------- root default root account root ``` ``` $ sacctmgr show account -n root default root account root ``` <br> --- --- <br> ## cluster 指令 ### 查 cluster name - ### 透過 scontrol 指令 ``` $ scontrol show config | egrep 'ClusterName|AccountingStorageType|AccountingStorageHost|AccountingStorageEnforce' AccountingStorageEnforce = associations,limits,safe AccountingStorageHost = slurm-accounting AccountingStorageType = accounting_storage/slurmdbd ClusterName = slurm_slurm ``` - ### 透過 sacctmgr 指令 ``` $ sacctmgr list cluster Cluster ControlHost ControlPort RPC Share GrpJobs GrpTRES GrpSubmit MaxJobs MaxTRES MaxSubmit MaxWall QOS Def QOS ---------- --------------- ------------ ----- --------- ------- ------------- --------- ------- ------------- --------- ----------- -------------------- --------- slurm_slu+ 10.244.65.60 6817 11264 1 normal ``` ``` $ sacctmgr list cluster format=Cluster%30 Cluster ------------------------------ slurm_slurm ``` <br> ### [案例] 如何將 account 新增到多個 cluster? - ### error ``` $ sacctmgr create account xxx cluster=tj-namespace error: Cluster 'tj-namespace' has not been added yet, please contact your admin before adding accounts to it ``` - ### 解決方法 根據錯誤訊息,您需要先將 cluster 新增到 Slurm 資料庫中,才能將 account 新增到該 cluster。 ### 解決步驟 #### 1. 先新增 Cluster 到 SlurmDBD ```bash # 新增單一 cluster sacctmgr add cluster tj-namespace # 或一次新增多個 clusters sacctmgr add cluster cluster1,cluster2,cluster3 ``` #### 2. 驗證 Cluster 是否已新增 ```bash sacctmgr show cluster ``` #### 3. 將 Account 新增到多個 Clusters **方法一:一次新增到多個 clusters** ```bash sacctmgr create account xxx cluster=cluster1,cluster2,cluster3 ``` **方法二:分別新增到各個 cluster** ```bash sacctmgr create account xxx cluster=cluster1 sacctmgr create account xxx cluster=cluster2 sacctmgr create account xxx cluster=cluster3 ``` #### 4. 驗證 Account 已正確新增 ```bash sacctmgr show account xxx -s ``` ### 完整範例 ```bash # 1. 新增所需的 clusters sacctmgr add cluster tj-namespace # 2. 確認 cluster 已新增 sacctmgr show cluster format=cluster,controlhost,controlport # 3. 新增 account 到 cluster sacctmgr create account xxx cluster=tj-namespace description="測試帳戶" # 4. 如果要新增到多個 clusters sacctmgr create account xxx cluster=tj-namespace,cluster2,cluster3 ``` ### 注意事項 - **Cluster 必須先存在於 SlurmDBD** 才能將 account 關聯到它 - 新增 cluster 通常需要 **root 或 slurm admin 權限** - 確認 `slurmdbd.conf` 中的 `ClusterName` 與您要新增的 cluster 名稱一致 - 如果是多 cluster 環境,每個 cluster 的 `slurm.conf` 都應該正確配置並指向同一個 SlurmDBD ### 檢查現有 Clusters ```bash # 查看所有已註冊的 clusters sacctmgr list cluster format=cluster,controlhost,nodecount # 查看特定 account 在哪些 clusters 中 sacctmagr list account xxx withassoc format=account,cluster,user ``` 需要我協助檢查您目前的 Slurm 配置或提供更詳細的設定範例嗎? <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> ### [刪除 account] 為何無法刪除某個 account? - ### Question ``` $ sacctmgr show account where name=administrator cluster=slurm_slurm --as Account Descr Org Cluster ParentName User ---------- -------------------- -------------------- ---------- ---------- ---------- administr+ 4d5fb274-059a-448a-+ ci.asus.com slurm_slu+ root administr+ 4d5fb274-059a-448a-+ ci.asus.com slurm_slu+ xxx-1 administr+ 4d5fb274-059a-448a-+ ci.asus.com slurm_slu+ xxx-2 administr+ 4d5fb274-059a-448a-+ ci.asus.com slurm_slu+ xxx-3 $ sacctmgr -i delete account where name=administrator cluster=slurm_slurm Error with request: You can not remove the default account of a user C = slurm_slurm A = administrator U = xxx-1 C = slurm_slurm A = administrator U = xxx-2 C = slurm_slurm A = administrator U = xxx-3 Please either remove the accounts listed above from list and resubmit, or change these users' default accounts to remove the account(s). Changes Discarded $ sacctmgr list user xxx-3 User Def Acct Admin ---------- ---------- --------- xxx-3 None $ sacctmgr list user xxx-3 --as User Def Acct Admin Cluster Account Partition ---------- ---------- --------- ---------- ---------- ---------- xxx-3 administr+ None slurm_slu+ 26d15dcc-+ xxx-3 administr+ None slurm_slu+ 4d5fb274-+ xxx-3 administr+ None slurm_slu+ administr+ xxx-3 administr+ None slurm_slu+ d15dcc-98+ xxx-3 administr+ None slurm_slu+ d5fb274-0+ ``` - ### `us.anthropic.claude-sonnet-4-5-20250929-v1:0` (2026/02/04) <!-- http://10.78.26.44:30000/deepwiki/slurm/-/issues/41 --> 根據錯誤訊息分析,無法刪除 `administrator` account 的原因是: ### 問題根源 **Slurm 不允許刪除使用者的預設 account(default account)** 從輸出可以看到: 1. `xxx-3` 的預設 account 是 `administrator` 2. 其他 2 個使用者(xxx-1, xxx-2)也都將 `administrator` 設為預設 account 3. Slurm 保護機制:刪除預設 account 會導致這些使用者無法提交作業 ### 解決方案 有兩種方式可以刪除 `administrator` account: #### 方案 1:先移除使用者的關聯 ```bash # 將所有使用者從 administrator account 中移除 # 當 Account != DeafultAccount sacctmgr -i remove user where account=administrator cluster=slurm_slurm # 當 Account == DeafultAccount sacctmgr -i remove user where defaultaccount=administrator cluster=slurm_slurm # 然後再刪除 account sacctmgr -i delete account where name=administrator cluster=slurm_slurm ``` #### 方案 2:變更使用者的預設 account ```bash # 先為每個使用者指定新的預設 account(假設有其他可用 account) sacctmgr -i modify user xxx-3 set defaultaccount=<其他account> sacctmgr -i modify user jay_ho@asus.com set defaultaccount=<其他account> # ... 其他使用者 # 然後刪除 administrator account sacctmgr -i delete account where name=administrator cluster=slurm_slurm ``` ### 觀察到的其他問題 從 `sacctmgr list user xxx-3 --as` 輸出可以看到: ``` xxx-3 administr+ None slurm_slu+ 26d15dcc-+ xxx-3 administr+ None slurm_slu+ 4d5fb274-+ xxx-3 administr+ None slurm_slu+ administr+ xxx-3 administr+ None slurm_slu+ d15dcc-98+ xxx-3 administr+ None slurm_slu+ d5fb274-0+ ``` 這位使用者關聯了 5 個 account,包括: - `administrator` (完整名稱) - `4d5fb274-...` (UUID 格式) - 其他截斷顯示的 account --- <br> ### [刪除 account] 為何刪除 account (Cluster 為空),不能攜帶 cluster='' 或 cluster= 參數? - ### Question ``` $ sacctmgr -i delete account b245c1b-0ad3-43f8-9afd-0ccfb0eab3db cluster='' Nothing deleted $ sacctmgr -i delete account b245c1b-0ad3-43f8-9afd-0ccfb0eab3db cluster= Nothing deleted $ sacctmgr -i delete account b245c1b-0ad3-43f8-9afd-0ccfb0eab3db Deleting accounts... b245c1b-0ad3-43f8-9afd-0ccfb0eab3db ``` 三者的差異? - ### `us.anthropic.claude-sonnet-4-5-20250929-v1:0` (2026/02/04) 這是 Slurm `sacctmgr` 命令的設計行為,讓我解釋原因: ### 核心概念 在 Slurm 資料庫中,**Account 可以同時存在於多個層級**: 1. **全域層級 (Global)**: `Cluster` 欄位為空 2. **Cluster 層級**: `Cluster` 欄位有值(如 `slurm_slurm`) ### 為何 `cluster=''` 或 `cluster=` 無法刪除 當你使用 `cluster=''` 或 `cluster=` 時: ```bash # 這兩個指令都無法刪除 Global Account sacctmgr -i delete account b245c1b... cluster='' sacctmgr -i delete account b245c1b... cluster= ``` **原因**: - `sacctmgr` 的 `cluster=` 參數被設計為**過濾條件**,用來指定要刪除哪個 Cluster 的 Account - 當你提供 `cluster=''` 或 `cluster=`,Slurm 會**嘗試尋找名稱為空字串的 Cluster**,而非「沒有 Cluster 的 Account」 - 因為不存在名為 `''` 的 Cluster,所以找不到任何符合條件的記錄 ### 正確的刪除方式 ```bash # ✅ 不帶 cluster 參數 = 刪除「所有層級」的該 Account(包含 Global) sacctmgr -i delete account b245c1b-0ad3-43f8-9afd-0ccfb0eab3db # ✅ 指定特定 Cluster = 只刪除該 Cluster 的 Account sacctmgr -i delete account b245c1b... cluster=slurm_slurm ``` ### Slurm 的查詢邏輯 ```bash # 顯示所有層級(Global + 所有 Cluster) sacctmgr show account where name=xxx # 只顯示特定 Cluster 的 Account sacctmgr show account where name=xxx cluster=slurm_slurm # ❌ 無法直接查詢「只有 Global」的 Account # 必須透過結果中 Cluster 欄位為空來判斷 ``` ### 設計理念 這種設計符合 Slurm 的分層架構: 1. **Global Account** = 預設值/範本,可被所有 Cluster 繼承 2. **Cluster-specific Account** = 覆寫特定 Cluster 的設定 3. **不帶 `cluster` 參數** = 操作所有層級(最徹底的刪除) ### 實務建議 如果你的程式需要**明確刪除 Global Account**: ```typescript // 1. 先查詢該 Account 存在於哪些層級 const accounts = await queryAccounts({ name: accountName }) // 2. 判斷是否有 Global Account(cluster 欄位為空) const hasGlobalAccount = accounts.some(a => !a.cluster) // 3. 如果只有 Global Account,直接刪除(不帶 cluster 參數) if (hasGlobalAccount && accounts.every(a => !a.cluster)) { await exec(`sacctmgr -i delete account ${accountName}`) } // 4. 如果同時有多個層級,需要分別處理 for (const account of accounts) { if (account.cluster) { await exec(`sacctmgr -i delete account ${accountName} cluster=${account.cluster}`) } else { // 最後刪除 Global(確保 Cluster-specific 先刪除) await exec(`sacctmgr -i delete account ${accountName}`) } } ``` **關鍵點**:`cluster=` 參數不支援「空值語義」,只能用來指定具體的 Cluster 名稱或完全省略。 <br> ### 更新 account 屬性 - ### Cluster 欄位是唯讀 ``` $ sacctmgr list account aa10ab75-48e9-4bdc-b251-7cfd857bd5ab --as Account Descr Org Cluster ---------- -------------------- -------------------- ---------- aa10ab75-+ tj-project personal $ sacctmgr update account aa10ab75-48e9-4bdc-b251-7cfd857bd5ab set cluster=slurm_slurm Can't modify the cluster of an account ``` - ### 正確的操作方式 ```bash # 將 account 新增到特定 cluster sacctmgr add account aa10ab75-48e9-4bdc-b251-7cfd857bd5ab cluster=slurm_slurm # --- # 如果 account 已存在於該 cluster,可能需要先移除再新增 # 先從原 cluster 移除(如果需要) sacctmgr delete account where account=aa10ab75-48e9-4bdc-b251-7cfd857bd5ab cluster=<old_cluster> # 再新增到新 cluster sacctmgr add account aa10ab75-48e9-4bdc-b251-7cfd857bd5ab cluster=slurm_slurm ``` - ### 重要概念 在 Slurm 中: 1. **Account 是全域的**,但需要與特定 cluster 建立關聯(association) 2. 一個 account 可以存在於多個 cluster 中 3. `cluster` 欄位空白表示該 account 尚未與任何 cluster 建立關聯 4. 必須透過 `add account ... cluster=<name>` 建立關聯,而不是 `update` 指令 <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 ... ``` - ### 必要資訊,若有缺失會有相對應的錯誤訊息 - `name` ``` Need name of user to add. ``` - `account` ``` Need name of account or wckey to add. ``` - ### :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> ### [刪除 user] 為何無法刪除某個關聯(user, account)? - ### Question ``` $ sacctmgr list user xxx-5 --as User Def Acct Admin Cluster Account Partition Share Priority MaxJobs MaxNodes MaxCPUs MaxSubmit MaxWall MaxCPUMins QOS Def QOS ---------- ---------- --------- ---------- ---------- ---------- --------- ---------- ------- -------- -------- --------- ----------- ----------- -------------------- --------- xxx-5 administr+ None slurm_slu+ 26d15dcc-+ 1 normal xxx-5 administr+ None slurm_slu+ 4d5fb274-+ 1 normal xxx-5 administr+ None slurm_slu+ administr+ 1 normal xxx-5 administr+ None slurm_slu+ d15dcc-98+ 1 normal xxx-5 administr+ None slurm_slu+ d5fb274-0+ 1 normal $ sacctmgr -i remove user xxx-5 where account=administrator cluster=slurm_slurm Error with request: You can not remove the default account of a user C = slurm_slurm A = administrator U = xxx-5 You must change the default account of these users or remove the users completely from the affected clusters to allow these changes. Changes Discarded ``` - ### `us.anthropic.claude-sonnet-4-5-20250929-v1:0` (2026/02/04) <!-- http://10.78.26.44:30000/deepwiki/slurm/-/issues/42 --> 根據錯誤訊息,無法刪除該使用者關聯是因為 **`administrator` 是該使用者的預設帳戶(Default Account)**。Slurm 不允許刪除使用者的預設帳戶關聯,除非先變更預設帳戶或完全移除該使用者。 ### 問題分析 從 `sacctmgr list user` 的輸出可以看到: - `xxx-5` 在 `slurm_slurm` cluster 上有 5 個 account 關聯 - `Def Acct` 欄位顯示 `administr+`(被截斷的 `administrator`),表示 `administrator` 是預設帳戶 - 嘗試刪除預設帳戶時,sacctmgr 會拒絕操作 ### 正確執行流程 有兩種解決方案: #### 方案 1:先變更預設帳戶,再刪除 ```bash # 1. 將預設帳戶變更為其他 account(例如 26d15dcc-xxx) sacctmgr -i modify user xxx-5 \ set defaultaccount=26d15dcc-9835-4d5f-b274-08bb4a26e836 \ where cluster=slurm_slurm # 2. 確認變更成功 sacctmgr list user xxx-5 --as # 3. 現在可以刪除 administrator 關聯 sacctmgr -i remove user xxx-5 \ where account=administrator cluster=slurm_slurm ``` #### 方案 2:直接從 cluster 完全移除使用者 如果目標是完全移除該使用者在此 cluster 的所有關聯: ```bash # 直接從 cluster 移除使用者(會移除所有 account 關聯) sacctmgr -i remove user xxx-5 where cluster=slurm_slurm ``` ### 關鍵概念 1. **Default Account 保護機制**:Slurm 要求每個使用者在 cluster 上必須有一個預設帳戶,以確保提交作業時有明確的計費/資源分配目標 2. **刪除順序**:必須先處理預設帳戶(變更或移除使用者),才能刪除該帳戶關聯 3. **完整列表**:使用 `sacctmgr list user <username> --associations` 可以看到完整的 account 名稱(不會被截斷) ### 建議操作 根據您的需求選擇: - 如果只想移除 `administrator` 關聯 → 使用**方案 1** - 如果想清除該使用者在此 cluster 的所有資料 → 使用**方案 2** --- <br> ### 更新 user 屬性 ``` $ 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 指令 ### associations 基礎知識 根據 sacctmgr 文件,association 由四個參數組成:`user`、`cluster`、`account`、`partition`。 <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> ### `sacctmgr modify association ...` --> 不支援 <br> ### `sacctmgr update association ...` --> 不支援 - ### 如何變更 deafult account? > 更新 user 關聯: > - old key=(user=tj, deafult_account=tn) > - new key=(user=tj, deafult_account=tp) > - 當 `old.Account` == `DefaultAccount` 時,必須先建立新的關聯 ``` $ sacctmgr show user --as User Def Acct Admin Cluster Account ---------- ---------- --------- ---------- ---------- tj tn None slurm_slu+ tn $ sacctmgr update user where name=tj set defaultaccount=tp Modified users... Can't modify because these users aren't associated with new default account 'tp'... U = tj C = slurm_slurm $ sacctmgr add user tj account=tp There is no uid for user 'tj' Are you sure you want to continue? (You have 30 seconds to decide) (N/y): y Associations = C = slurm_slurm A = tp U = tj Would you like to commit changes? (You have 30 seconds to decide) (N/y): y $ sacctmgr show user --as User Def Acct Admin Cluster Account ---------- ---------- --------- ---------- ---------- tj tn None slurm_slu+ tn tj tn None slurm_slu+ tp $ sacctmgr update user where name=tj set defaultaccount=tp Modified users... tj Would you like to commit changes? (You have 30 seconds to decide) (N/y): y $ sacctmgr show user --as User Def Acct Admin Cluster Account ---------- ---------- --------- ---------- ---------- tj tp None slurm_slu+ tn tj tp None slurm_slu+ tp ``` - ### 什麼時候可直接變更 deafult account?當變更後的關聯存在時,才可直接變更 ``` $ sacctmgr show user --as User Def Acct Admin Cluster Account ---------- ---------- --------- ---------- ---------- tj tp None slurm_slu+ tn tj tp None slurm_slu+ tp $ sacctmgr modify user where name=tj set DefaultAccount=tn Modified users... tj Would you like to commit changes? (You have 30 seconds to decide) (N/y): y ``` <br> ### `sacctmgr delete association ...` --> 不支援 - ### 操作對象必須是 account 或 user,不支援 delete assoc (會有底下錯誤訊息) ``` sacctmgr delete assoc where user=tj cluster=slurm_slurm account=tn No valid entity in delete command Input line must include "Account", "Cluster", "Coordinator", "Federation", "QOS", "Resource", or "User" ``` - ### 刪除 user 關聯:key=(user=tj, account=tn) ``` $ sacctmgr delete user tj account=tn Error with request: You can not remove the default account of a user C = slurm_slurm A = tn U = tj You must change the default account of these users or remove the users completely from the affected clusters to allow these changes. Changes Discarded ``` - **當 `Account` == `DefaultAccount` 時,必須先將 `DefaultAccount` 變更為其他既有的 `account`** ``` $ sacctmgr update user where name=tj set DefaultAccount=administrator # ---------------------------------------------- # 若寫成 set Account=administrator,會有底下的錯誤: # Unknown option: account=tj-project # Use keyword 'where' to modify condition # ---------------------------------------------- # 檢查變更結果 $ sacctmgr show user tj --as # 再執行 $ sacctmgr delete user tj account=tn ``` - **需留意必要 `--as` 參數** ``` $ sacctmgr show user tj_tsai format=User,DefaultAccount User Def Acct ------- ---------- tj_tsai <-- 空值, $ sacctmgr show user tj_tsai format=User,DefaultAccount --association User Def Acct ------- ---------- tj_tsai administr+ tj_tsai administr+ tj_tsai administr+ tj_tsai administr+ tj_tsai administr+ ``` <br> ### `sacctmgr remove association ...` --> 不支援 <br> <br> ## QoS 指令 > [[HackMD] [Account] QoS](https://hackmd.io/VLbIXsIjTba9KAYejFVSjw) ### QoS 操作範例:建立與套用 > by `us.anthropic.claude-sonnet-4-5-20250929-v1:0` (2026/01/21) > - ### Step 1: 建立 QOS (使用 sacctmgr) ```bash # 建立名為 limit_3_jobs 的 QOS,限制每位 user 最多同時執行 3 個 job sacctmgr add qos limit_3_jobs MaxJobsPerUser=3 # 驗證 QOS 是否建立成功 sacctmgr show qos format=Name,MaxJobsPerUser ``` **補充選項** (根據需求可添加更多限制): ```bash # 建立更完整的 QOS 設定 sacctmgr add qos limit_3_jobs \ MaxJobsPerUser=3 \ MaxSubmitJobsPerUser=10 \ Priority=100 # 查看詳細 QOS 資訊 sacctmgr show qos limit_3_jobs -p ``` --- - ### Step 2: 套用 QOS #### **策略 1: 針對 Partition 強制套用 (Hard Limit)** 所有在該 partition 執行的 job 都會受到此 QOS 限制。 ```bash # 假設 partition 名稱為 compute scontrol update PartitionName=compute QOS=limit_3_jobs # 驗證設定 scontrol show partition compute | grep QOS # 或使用 sinfo -o "%P %l %D %N %Q" -p compute ``` **注意事項**: - 此方法會強制所有使用該 partition 的 user 都受到 QOS 限制 - 無法針對特定 user 做例外處理 --- #### **策略 2: 針對特定 Account/User 套用 (Soft/Specific Limit) ⭐推薦** 更靈活的方式,可以針對特定 account 或 user 套用 QOS。 ```bash # 方法 A: 針對特定 Account 在特定 Partition 套用 QOS sacctmgr modify account <account_name> \ set qos=limit_3_jobs \ where partition=<partition_name> # 實際範例 sacctmgr modify account default_account \ set qos=limit_3_jobs \ where partition=compute # 驗證 sacctmgr show assoc format=Account,Partition,QOS \ where partition=compute ``` ```bash # 方法 B: 針對特定 User 在特定 Partition 套用 QOS sacctmgr modify user <username> \ set qos=limit_3_jobs \ where account=<account_name> partition=<partition_name> # 實際範例 sacctmgr modify user john \ set qos=limit_3_jobs \ where account=default_account partition=compute # 驗證 sacctmgr show assoc format=User,Account,Partition,QOS \ where user=john partition=compute ``` ```bash # 方法 C: 批次套用到整個 Cluster 的 Account (所有 partition) sacctmgr modify account <account_name> \ set qos=limit_3_jobs # 實際範例 sacctmgr modify account default_account \ set qos=limit_3_jobs # 驗證 sacctmgr show assoc format=Account,Partition,QOS \ where account=default_account ``` **VIP User 例外處理範例**: ```bash # 為 VIP user 建立不受限制的 QOS sacctmgr add qos unlimited MaxJobsPerUser=-1 # 套用到特定 VIP user sacctmgr modify user vip_user \ set qos=unlimited \ where account=default_account partition=compute ``` --- - ### 完整設定流程範例 假設需求: - Partition 名稱: `compute` - Account 名稱: `research_team` - 限制: 每位 user 最多同時執行 3 個 job - VIP user: `admin` 不受限制 ```bash # Step 1: 建立 QOS sacctmgr add qos limit_3_jobs MaxJobsPerUser=3 -i sacctmgr add qos unlimited MaxJobsPerUser=-1 -i # Step 2: 套用到 account (策略 2) sacctmgr modify account research_team \ set qos=limit_3_jobs \ where partition=compute -i # Step 3: 設定 VIP 例外 sacctmgr modify user admin \ set qos=unlimited \ where account=research_team partition=compute -i # Step 4: 驗證設定 sacctmgr show qos format=Name,MaxJobsPerUser sacctmgr show assoc format=Account,User,Partition,QOS \ where partition=compute # Step 5: 測試 (以一般 user 身份) srun -p compute --qos=limit_3_jobs hostname ``` --- - ### 驗證與測試指令 ```bash # 查看所有 QOS sacctmgr show qos # 查看特定 partition 的 association 和 QOS sacctmgr show assoc format=Cluster,Account,User,Partition,QOS \ where partition=compute # 查看 user 的有效 QOS sacctmgr show user <username> withassoc format=User,Account,Partition,QOS # 測試 job 提交 (應該受到 QOS 限制) for i in {1..5}; do sbatch -p compute --wrap="sleep 300" & done # 查看正在執行的 job 數量 squeue -u $USER -p compute -t RUNNING | wc -l # 應該不超過 3 個 ``` --- - ### 移除/修改 QOS 指令 ```bash # 移除 account 的 QOS sacctmgr modify account <account_name> \ set qos='' \ where partition=<partition_name> # 刪除 QOS sacctmgr delete qos limit_3_jobs # 修改 QOS 參數 sacctmgr modify qos limit_3_jobs set MaxJobsPerUser=5 ``` --- - ### 建議 **推薦使用策略 2 (針對 Account/User 套用)**,原因: 1. ✅ 靈活性高,可針對不同 user/account 設定不同限制 2. ✅ 可輕鬆設定 VIP user 例外 3. ✅ 不影響其他 partition 4. ✅ 符合多租戶環境的最佳實踐 策略 1 (Partition 層級) 適用於: - 需要對所有 user 一視同仁的簡單環境 - 不需要例外處理的場景 所有指令中的 `-i` 參數代表 immediate (立即執行不詢問確認),生產環境建議移除此參數以進行人工確認。 根據我對 Slurm 原始碼和文檔的分析,我已經整理出 QoS 最常用的參數。讓我為您整理這些參數,依使用頻率由高到低排列: <br> ### Slurm QoS 最常用參數(依使用頻率排序) > by `us.anthropic.claude-sonnet-4-5-20250929-v1:0` (2026/01/21) #### **1. Priority(優先級)** - **用途**:設定 QoS 的優先權,影響 job 排程優先順序 - **範例**:`Priority=100` - **預設值**:未設定(無額外優先權) #### **2. MaxJobsPerUser(每使用者最大執行作業數)** - **用途**:限制單一使用者可同時執行的作業數量 - **範例**:`MaxJobsPerUser=3` - **別名**:`MaxJobsPU` #### **3. MaxSubmitJobsPerUser(每使用者最大提交作業數)** - **用途**:限制單一使用者可同時處於待執行或執行中的作業總數 - **範例**:`MaxSubmitJobsPerUser=10` - **別名**:`MaxSubmitJobsPU` #### **4. GrpTRES(群組資源總量限制)** - **用途**:限制此 QoS 所有執行中作業可使用的總資源量 - **範例**:`GrpTRES=cpu=24` 或 `GrpTRES=node=10,cpu=100,mem=500G` - **常用資源**:cpu, mem, node, gres/gpu #### **5. MaxTRESPerJob(每作業最大資源量)** - **用途**:限制單一作業可使用的最大資源量 - **範例**:`MaxTRESPerJob=cpu=16,mem=64G` - **別名**:`MaxTRES`, `MaxTRESPJ` #### **6. MaxWall(每作業最大執行時間)** - **用途**:限制單一作業的最長執行時間 - **範例**:`MaxWall=2:00:00`(2 小時)或 `MaxWall=7-00:00:00`(7 天) - **格式**:`<min>` 或 `<hr>:<min>:<sec>` 或 `<days>-<hr>:<min>:<sec>` - **別名**:`MaxWallDurationPerJob` #### **7. GrpJobs(群組最大執行作業數)** - **用途**:限制此 QoS 所有使用者可同時執行的作業總數 - **範例**:`GrpJobs=50` #### **8. GrpSubmitJobs(群組最大提交作業數)** - **用途**:限制此 QoS 所有作業(待執行+執行中)的總數 - **範例**:`GrpSubmitJobs=100` - **別名**:`GrpSubmit` #### **9. MaxTRESPerUser(每使用者最大資源量)** - **用途**:限制單一使用者可同時使用的總資源量 - **範例**:`MaxTRESPerUser=cpu=48,mem=256G` - **別名**:`MaxTRESPU` #### **10. GrpTRESRunMins(群組資源執行分鐘數限制)** - **用途**:限制執行中作業的資源時間總量(考慮 time limit) - **範例**:`GrpTRESRunMins=cpu=10000` - **說明**:達到限制時不會啟動新作業,直到有作業結束釋放時間 #### **11. MaxJobsPerAccount(每帳戶最大執行作業數)** - **用途**:限制單一帳戶可同時執行的作業數量 - **範例**:`MaxJobsPerAccount=20` - **別名**:`MaxJobsPA` #### **12. MaxSubmitJobsPerAccount(每帳戶最大提交作業數)** - **用途**:限制單一帳戶可同時處於待執行或執行中的作業總數 - **範例**:`MaxSubmitJobsPerAccount=50` - **別名**:`MaxSubmitJobsPA` #### **13. GrpWall(群組總執行時間限制)** - **用途**:限制所有執行中作業的總執行時間,達到限制會拒絕新提交並終止執行中作業 - **範例**:`GrpWall=1000:00:00` - **注意**:需啟用 Priority Multifactor plugin #### **14. MaxTRESPerNode(每節點最大資源量)** - **用途**:限制作業中每個節點可使用的資源量 - **範例**:`MaxTRESPerNode=cpu=32,mem=128G` - **別名**:`MaxTRESPN` #### **15. Flags(特殊標記)** - **用途**:設定特殊行為標記 - **範例**:`Flags=DenyOnLimit,OverPartQOS` - **常用標記**: - `DenyOnLimit`:超過限制時直接拒絕提交 - `OverPartQOS`:覆蓋 Partition QoS 限制 - `NoReserve`:不在 backfill 中保留資源 - `RequiresReservation`:必須指定 reservation #### **其他實用參數** - **GrpTRESMins**:歷史累積資源分鐘數限制(會隨時間衰減) - **MaxTRESMinsPerJob**:每作業最大資源分鐘數 - **Preempt**:可搶佔的其他 QoS 列表 - **PreemptMode**:搶佔模式(CANCEL, REQUEUE, SUSPEND) - **GraceTime**:被搶佔時的寬限時間 - **UsageFactor**:使用量計算因子(影響 fairshare) - **LimitFactor**:限制放大因子 #### **完整範例** ```bash # 建立一般使用者 QoS sacctmgr add qos normal \ Priority=50 \ MaxJobsPerUser=5 \ MaxSubmitJobsPerUser=20 \ MaxTRESPerJob=cpu=32,mem=128G \ MaxWall=24:00:00 # 建立高優先級 QoS(有限制) sacctmgr add qos high_priority \ Priority=200 \ MaxJobsPerUser=2 \ MaxSubmitJobsPerUser=5 \ GrpTRES=cpu=100,mem=500G \ MaxWall=12:00:00 \ Flags=DenyOnLimit # 建立測試用 QoS sacctmgr add qos testing \ Priority=10 \ MaxJobsPerUser=10 \ GrpJobs=50 \ MaxTRESPerJob=cpu=4,mem=16G \ MaxWall=1:00:00 \ Preempt=normal ``` 這份清單是根據 Slurm 測試套件中的使用頻率、文檔範例以及實際使用場景所整理。最常用的前五個參數(Priority, MaxJobsPerUser, MaxSubmitJobsPerUser, GrpTRES, MaxTRESPerJob)幾乎在所有 QoS 配置中都會使用。 <br> ### QoS 表格資訊快覽 > by `us.anthropic.claude-sonnet-4-5-20250929-v1:0` (2026/01/21) #### Slurm QoS 最常用參數表(依使用頻率排序) | 排序 | 參數名稱 | 別名 | 用途說明 | 範例值 | 預設值 | |------|---------|------|---------|--------|--------| | 1 | **Priority** | - | 設定 QoS 優先權,影響作業排程順序 | `Priority=100` | 未設定 | | 2 | **MaxJobsPerUser** | MaxJobsPU | 限制單一使用者可同時執行的作業數 | `MaxJobsPerUser=3` | 無限制 | | 3 | **MaxSubmitJobsPerUser** | MaxSubmitJobsPU | 限制單一使用者可提交(待執行+執行中)的作業總數 | `MaxSubmitJobsPerUser=10` | 無限制 | | 4 | **GrpTRES** | - | 限制此 QoS 所有執行中作業的總資源量 | `GrpTRES=cpu=24,mem=128G` | 無限制 | | 5 | **MaxTRESPerJob** | MaxTRES, MaxTRESPJ | 限制單一作業可使用的最大資源量 | `MaxTRESPerJob=cpu=16,mem=64G` | 無限制 | | 6 | **MaxWall** | MaxWallDurationPerJob | 限制單一作業的最長執行時間 | `MaxWall=2:00:00` 或 `7-00:00:00` | 無限制 | | 7 | **GrpJobs** | - | 限制此 QoS 所有使用者可同時執行的作業總數 | `GrpJobs=50` | 無限制 | | 8 | **GrpSubmitJobs** | GrpSubmit | 限制此 QoS 所有作業(待執行+執行中)的總數 | `GrpSubmitJobs=100` | 無限制 | | 9 | **MaxTRESPerUser** | MaxTRESPU | 限制單一使用者可同時使用的總資源量 | `MaxTRESPerUser=cpu=48,mem=256G` | 無限制 | | 10 | **GrpTRESRunMins** | - | 限制執行中作業的資源時間總量(考慮 time limit) | `GrpTRESRunMins=cpu=10000` | 無限制 | | 11 | **MaxJobsPerAccount** | MaxJobsPA | 限制單一帳戶可同時執行的作業數量 | `MaxJobsPerAccount=20` | 無限制 | | 12 | **MaxSubmitJobsPerAccount** | MaxSubmitJobsPA | 限制單一帳戶可提交的作業總數 | `MaxSubmitJobsPerAccount=50` | 無限制 | | 13 | **GrpWall** | - | 限制所有執行中作業的總執行時間 | `GrpWall=1000:00:00` | 無限制 | | 14 | **MaxTRESPerNode** | MaxTRESPN | 限制作業中每個節點可使用的資源量 | `MaxTRESPerNode=cpu=32,mem=128G` | 無限制 | | 15 | **Flags** | - | 設定特殊行為標記 | `Flags=DenyOnLimit,OverPartQOS` | 無標記 | #### MaxWall 時間格式說明 | 格式 | 範例 | 說明 | |------|------|------| | `<min>` | `60` | 60 分鐘 | | `<hr>:<min>:<sec>` | `2:30:00` | 2 小時 30 分鐘 | | `<days>-<hr>:<min>:<sec>` | `7-12:00:00` | 7 天 12 小時 | #### 常用 Flags 標記 | 標記 | 功能說明 | |------|---------| | **DenyOnLimit** | 超過限制時直接拒絕作業提交(而非排隊等待) | | **OverPartQOS** | 此 QoS 設定會覆蓋 Partition QoS 的限制 | | **NoReserve** | 不在 backfill 排程中為此 QoS 作業保留資源 | | **RequiresReservation** | 使用此 QoS 的作業必須指定 reservation | | **PartitionMaxNodes** | 強制執行 partition 的 MaxNodes 限制 | | **PartitionMinNodes** | 強制執行 partition 的 MinNodes 限制 | | **PartitionTimeLimit** | 強制執行 partition 的 TimeLimit 限制 | #### 其他實用參數 | 參數名稱 | 用途說明 | 範例 | |---------|---------|------| | **GrpTRESMins** | 歷史累積資源分鐘數限制(會隨時間衰減) | `GrpTRESMins=cpu=100000` | | **MaxTRESMinsPerJob** | 單一作業最大資源分鐘數(資源量×時間) | `MaxTRESMinsPerJob=cpu=10000` | | **Preempt** | 可搶佔的其他 QoS 列表 | `Preempt=normal,low` | | **PreemptMode** | 搶佔模式 | `PreemptMode=REQUEUE` | | **GraceTime** | 被搶佔時的寬限時間 | `GraceTime=00:05:00` | | **UsageFactor** | 使用量計算因子(影響 fairshare) | `UsageFactor=2.0` | | **LimitFactor** | 限制放大因子 | `LimitFactor=1.5` | #### 常見使用情境範例 ##### 情境 1:一般使用者 QoS ```bash sacctmgr add qos normal \ Priority=50 \ MaxJobsPerUser=5 \ MaxSubmitJobsPerUser=20 \ MaxTRESPerJob=cpu=32,mem=128G \ MaxWall=24:00:00 ``` ##### 情境 2:高優先級 QoS(有資源限制) ```bash sacctmgr add qos high_priority \ Priority=200 \ MaxJobsPerUser=2 \ MaxSubmitJobsPerUser=5 \ GrpTRES=cpu=100,mem=500G \ MaxWall=12:00:00 \ Flags=DenyOnLimit,OverPartQOS ``` ##### 情境 3:測試用 QoS(可被搶佔) ```bash sacctmgr add qos testing \ Priority=10 \ MaxJobsPerUser=10 \ GrpJobs=50 \ MaxTRESPerJob=cpu=4,mem=16G \ MaxWall=1:00:00 \ Preempt=normal ``` ##### 情境 4:大型作業 QoS(需 Reservation) ```bash sacctmgr add qos large_jobs \ Priority=150 \ MaxJobsPerUser=1 \ MaxTRESPerJob=node=20,cpu=800 \ MaxWall=7-00:00:00 \ Flags=RequiresReservation ``` 這樣的表格格式讓參數對照更清楚明瞭! <br> --- --- <br> # slurmdb 欄位 ## SlurmDB 資料表欄位說明 ### [前言] 欄位說明補充 - **時間戳記欄位** (`creation_time`, `mod_time`):使用 Unix timestamp(`bigint unsigned`)格式 - **軟刪除機制**:`deleted` 欄位允許邏輯刪除而不實際移除資料 - **Admin Level** (`admin_level`):定義使用者的管理權限層級(預設值為 1) - **文字欄位長度限制**: - `tinytext`:最大 255 bytes - `text`:最大 65,535 bytes - **資料來源**:https://github.com/SchedMD/slurm/blob/master/src/plugins/accounting_storage/mysql/accounting_storage_mysql.c#L519-L677 <br> --- ### Account 表格 (acct_table) | 欄位名稱 | 資料型別 | 限制條件 | 說明 | |---------|---------|---------|------| | `creation_time` | `bigint unsigned` | `not null` | 建立時間戳記 | | `mod_time` | `bigint unsigned` | `default 0 not null` | 最後修改時間戳記 | | `deleted` | `tinyint` | `default 0` | 軟刪除標記(0=未刪除,1=已刪除) | | `flags` | `int unsigned` | `default 0` | 帳號旗標設定 | | `name` | `tinytext` | `not null` | 帳號名稱(主鍵) | | `description` | `text` | `not null` | 帳號描述 | | `organization` | `text` | `not null` | 所屬組織 | **索引鍵:** `PRIMARY KEY (name(42))` <br> --- ### User 表格 (user_table) | 欄位名稱 | 資料型別 | 限制條件 | 說明 | |---------|---------|---------|------| | `creation_time` | `bigint unsigned` | `not null` | 建立時間戳記 | | `mod_time` | `bigint unsigned` | `default 0 not null` | 最後修改時間戳記 | | `deleted` | `tinyint` | `default 0` | 軟刪除標記(0=未刪除,1=已刪除) | | `name` | `tinytext` | `not null` | 使用者名稱(主鍵) | | `admin_level` | `smallint` | `default 1 not null` | 管理者權限等級 | - **索引鍵**: `PRIMARY KEY (name(42))` - **更多資訊**:[[HackMD] [Account] Account / user table](https://hackmd.io/SCBBhOWKTYKZaZiw2kxAdQ) <br> --- ### Account Coordinator 表格 (acct_coord_table) 這是關聯 account 和 user 的協調員表格: | 欄位名稱 | 資料型別 | 限制條件 | 說明 | |---------|---------|---------|------| | `creation_time` | `bigint unsigned` | `not null` | 建立時間戳記 | | `mod_time` | `bigint unsigned` | `default 0 not null` | 最後修改時間戳記 | | `deleted` | `tinyint` | `default 0` | 軟刪除標記 | | `acct` | `tinytext` | `not null` | 帳號名稱 | | `user` | `tinytext` | `not null` | 使用者名稱 | **索引鍵:** - `PRIMARY KEY (acct(42), user(42))` - `KEY user (user(42))` <br> --- ### Association 表格 (assoc_table) | 欄位名稱 | 資料型別 | 限制條件 | 說明 | |---------|---------|---------|------| | `creation_time` | `bigint unsigned` | `not null` | 建立時間戳記 | | `mod_time` | `bigint unsigned` | `default 0 not null` | 最後修改時間戳記 | | `deleted` | `tinyint` | `default 0 not null` | 軟刪除標記(0=未刪除,1=已刪除) | | `comment` | `text` | - | 註解說明 | | `flags` | `int unsigned` | `default 0 not null` | 旗標設定 | | `is_def` | `tinyint` | `default 0 not null` | 是否為預設 association(0=否,1=是) | | `id_assoc` | `int unsigned` | `not null auto_increment` | **Association ID(主鍵,自動遞增)** | | `user` | `tinytext` | `not null default ''` | 使用者名稱(可為空=account association) | | `acct` | `tinytext` | `not null` | 帳號名稱 | | `partition` | `tinytext` | `not null default ''` | 分區名稱(可為空) | | `parent_acct` | `tinytext` | `not null default ''` | 父帳號名稱 | | `id_parent` | `int unsigned` | `not null` | 父 association 的 ID | | `lineage` | `text` | - | 帳號層級譜系 | | `shares` | `int` | `default 1 not null` | 公平共享份額(預設 1) | | `max_jobs` | `int` | `default NULL` | 最大同時執行作業數 | | `max_jobs_accrue` | `int` | `default NULL` | 最大累積優先權的作業數 | | `min_prio_thresh` | `int` | `default NULL` | 最小優先權門檻 | | `max_submit_jobs` | `int` | `default NULL` | 最大提交作業數 | | `max_tres_pj` | `text` | `not null default ''` | 每作業最大 TRES(Trackable RESources) | | `max_tres_pn` | `text` | `not null default ''` | 每節點最大 TRES | | `max_tres_mins_pj` | `text` | `not null default ''` | 每作業最大 TRES 分鐘數 | | `max_tres_run_mins` | `text` | `not null default ''` | 執行最大 TRES 分鐘數 | | `max_wall_pj` | `int` | `default NULL` | 每作業最大執行時間(分鐘) | | `grp_jobs` | `int` | `default NULL` | 群組最大同時執行作業數 | | `grp_jobs_accrue` | `int` | `default NULL` | 群組最大累積優先權的作業數 | | `grp_submit_jobs` | `int` | `default NULL` | 群組最大提交作業數 | | `grp_tres` | `text` | `not null default ''` | 群組最大 TRES | | `grp_tres_mins` | `text` | `not null default ''` | 群組最大 TRES 分鐘數 | | `grp_tres_run_mins` | `text` | `not null default ''` | 群組執行最大 TRES 分鐘數 | | `grp_wall` | `int` | `default NULL` | 群組最大執行時間(分鐘) | | `priority` | `int unsigned` | `default NULL` | 優先權等級 | | `def_qos_id` | `int` | `default NULL` | 預設 QoS(Quality of Service)ID | | `qos` | `blob` | `not null default ''` | 允許的 QoS 列表(二進位格式) | | `delta_qos` | `blob` | `not null default ''` | 增量 QoS 列表(二進位格式) | - ### 索引鍵: - `PRIMARY KEY (id_assoc)` - `UNIQUE INDEX udex (user(42), acct(42), partition(42))` - ### Association 表格關鍵概念 **Association** 是 Slurm 中最核心的權限與資源管理機制,它定義了: 1. **User ↔ Account 的關聯**: - 當 `user` 欄位有值時,這是 **User Association**(使用者綁定到特定帳號) - 當 `user` 欄位為空時,這是 **Account Association**(帳號本身的設定) 2. **階層式帳號結構**: - `parent_acct` 和 `id_parent` 定義帳號的父子關係 - `lineage` 記錄完整的帳號層級路徑 3. **資源限制(Limits)**: - **個人限制**:`max_*` 開頭的欄位(如 `max_jobs`, `max_wall_pj`) - **群組限制**:`grp_*` 開頭的欄位(如 `grp_jobs`, `grp_tres`) 4. **TRES(Trackable RESources)**: - 可追蹤的資源類型(CPU、Memory、GPU、Licenses 等) - 以文字格式儲存資源配額(如 `cpu=100,mem=512G,gpu=4`) 5. **Partition 綁定**: - 可以為特定 partition(分區)設定不同的 association - `partition` 欄位為空表示適用於所有分區 - ### 資料來源 https://github.com/SchedMD/slurm/blob/master/src/plugins/accounting_storage/mysql/accounting_storage_mysql.c#L1136-L1190 <br> --- <br> ## SlurmDB 資料表 Q & A ### 為何 `sacctmgr [create|modify]` 沒辦法直接對 association 操作? - ### `us.anthropic.claude-sonnet-4-5-20250929-v1:0` (2026/01/31) 答案是:**sacctmgr 可以操作 association,但不是直接使用 "association" 這個實體名稱,而是透過操作 "User" 和 "Account" 來間接管理 association**。 --- ### 📌 關鍵原因分析 根據原始碼的實作(`src/sacctmgr/sacctmgr.c:649-935`),sacctmgr 的設計哲學是: #### 1. **建立 (CREATE/ADD) 命令支援的實體** ```c // sacctmgr.c:673-695 if (!xstrncasecmp(argv[0], "Account", MAX(command_len, 1))) { error_code = sacctmgr_add_account((argc - 1), &argv[1]); } else if (!xstrncasecmp(argv[0], "Cluster", MAX(command_len, 2))) { error_code = sacctmgr_add_cluster((argc - 1), &argv[1]); } else if (!xstrncasecmp(argv[0], "User", MAX(command_len, 1))) { error_code = sacctmgr_add_user((argc - 1), &argv[1]); } // ❌ 沒有 "Association" 選項 ``` #### 2. **修改 (MODIFY) 命令支援的實體** ```c // sacctmgr.c:906-930 if (xstrncasecmp(argv[0], "Accounts", MAX(command_len, 1)) == 0) { error_code = sacctmgr_modify_account((argc - 1), &argv[1]); } else if (xstrncasecmp(argv[0], "Users", MAX(command_len, 1)) == 0) { error_code = sacctmgr_modify_user((argc - 1), &argv[1]); } // ❌ 沒有 "Association" 選項 ``` #### 3. **查詢 (LIST/SHOW) 命令則有支援 Association** ```c // sacctmgr.c:816-818 } else if (xstrncasecmp(argv[0], "Associations", MAX(command_len, 2)) == 0) { error_code = sacctmgr_list_assoc((argc - 1), &argv[1]); } // ✅ 可以 LIST Associations ``` --- ### 🎯 正確的使用方式 #### ❌ **錯誤語法(不支援)** ```bash # 這些命令不存在 sacctmgr create association ... # ❌ 不支援 sacctmgr modify association ... # ❌ 不支援 ``` #### ✅ **正確語法(間接操作 Association)** **1. 建立 Association:透過 `add user` 或 `add account`** ```bash # 建立 User Association(user + account + cluster) sacctmgr add user brian account=chemistry # 為使用者新增到特定 cluster sacctmgr add user adam account=physics cluster=tux # 建立 Account(會自動建立 Account Association) sacctmgr add account physics ``` **2. 修改 Association:透過 `modify user` 或 `modify account`** ```bash # 修改 User Association 的資源限制 sacctmgr modify user where name=adam cluster=tux account=physics \ set maxjobs=2 maxwall=30:00 # 正確的語法結構(WHERE 子句很重要) sacctmgr modify user name=adam cluster=tux set fairshare=10 sacctmgr modify user name=adam set fairshare=10 where cluster=tux # 修改 QoS(使用 += 運算子) sacctmgr modify user name=adam set qos+=expedite ``` **3. 查詢 Association:可以直接使用 `list associations`** ```bash # 這個是可以的! sacctmgr list associations cluster=tux format=Account,Cluster,User,Fairshare tree withd ``` --- ### 🧠 設計理念 Slurm 的 Association 設計採用「**自動管理**」策略: | 操作 | 自動建立的 Association | |------|----------------------| | `add account test` | 建立 Account Association(account=test) | | `add user adam account=test` | 建立 User Association(user=adam, account=test) | | `modify user name=adam ...` | 修改 User Association 的屬性 | **為什麼這樣設計?** 1. **簡化操作**:避免使用者需要手動管理複雜的 association ID 2. **保持一致性**:User 和 Account 的關聯自動維護 3. **抽象層次**:使用者只需關注「將 user 加入 account」,而不需理解底層的 association 機制 --- ### 📚 補充:Association 的三種類型 | Association 類型 | user 欄位 | acct 欄位 | 建立方式 | |----------------|----------|----------|---------| | **Root Association** | 空 | `root` | 系統自動建立 | | **Account Association** | 空 | 有值 | `sacctmgr add account` | | **User Association** | 有值 | 有值 | `sacctmgr add user` | --- ### 總結 **sacctmgr 沒有直接的 `create/modify association` 命令的原因:** 1. **設計哲學**:Association 是 User 與 Account 的關聯,透過操作 User/Account 自動管理 Association 更符合直覺 2. **降低複雜度**:避免使用者需要手動處理 association ID 和資料庫 schema 3. **保持一致性**:由系統自動維護 User-Account-Cluster 的關聯關係 正確做法是使用 `sacctmgr [add|modify] user` 或 `sacctmgr [add|modify] account` 來間接管理 association,只有在查詢時才使用 `sacctmgr list associations`。 參考檔案: - `src/sacctmgr/sacctmgr.c:649-935` - `doc/man/man1/sacctmgr.1:3736-3787` <br> --- --- <br> # Q & A ## modify & update 指令 ### 自動化注意事項 - `-i`, `--immediate`: commit changes immediately 直接跳過「**是否要提交變更?**」的互動確認,直接送出變更 - **簡單講**:**不確認有哪些變更,直接送出 commit** - **用途**:適合自動化作業 - **備註**: - 若本來就沒有需要提交的東西(例如 list/show、或 modify where ... 沒選到任何對象),加不加 -i 看起來就「沒差」。 <br> ## Troubleshooting ### [重要] 使用 modify & update 指令設定好,卻沒有效果? - ### 問題:設定上沒有同步,或有延遲 - ### 解法1:讓控制器重讀設定與快取 (i.e. 把控制器強制刷新) ```bash # 在實體機或 VM 中,重啟 controller systemctl restart slurmctld # 在 K8s 環境中,讓控制器重讀設定與快取 kubectl -n slurm exec pod/slurm-controller-0 -- scontrol reconfigure # 在 pod / container 中執行: scontrol reconfigure ``` - **Slurm-on-K8s / Slinky operator** ```bash # 讓控制器重讀設定與快取 kubectl -n slurm exec pod/slurm-controller-0 -- scontrol reconfigure ``` 或是: - 在 control 節點、login 節點、compute 節點 (能執行 `scontrol` 指令的地方) 都適合執行 `scontrol reconfigure` - **需要 Slurm 管理員權限** - ### 解法2: 如果需要立即生效,加上 -i 選項: ``` sacctmgr -i ... ``` - `-i` or `--immediate`: commit changes immediately <br> --- <br> ### [重要] srun: error: Unable to allocate resources: Invalid account or account/partition combination specified --> negative cache 問題 - ### 問題: - 沒有正確關聯下,執行 srun 失敗 - 管理者設定正確關聯後,執行 srun 依舊遇到失敗 - ### 解法1:讓控制器重讀設定與快取 (i.e. 把控制器強制刷新) ```bash # 在實體機或 VM 中,重啟 controller systemctl restart slurmctld # 在 K8s 環境中,讓控制器重讀設定與快取 kubectl -n slurm exec pod/slurm-controller-0 -- scontrol reconfigure # 在 pod / container 中執行: scontrol reconfigure ``` - **Slurm-on-K8s / Slinky operator** ```bash # 讓控制器重讀設定與快取 kubectl -n slurm exec pod/slurm-controller-0 -- scontrol reconfigure ``` 或是: - 在 control 節點、login 節點、compute 節點 (能執行 `scontrol` 指令的地方) 都適合執行 `scontrol reconfigure` - **需要 Slurm 管理員權限** - ### 解法2: 如果需要立即生效,加上 -i 選項: ``` sacctmgr -i ... ``` - `-i` or `--immediate`: commit changes immediately - ### 備註: - `sacctmgr delete user` 不會有 cache 問題 - ### 補充: > codebase: https://github.com/SchedMD/slurm > by `us.anthropic.claude-sonnet-4-5-20250929-v1:0` (2026/01/21) ### **長期預防措施** 在您的程式碼中,當執行 `sacctmgr create user` 新增 partition association 後: ```python # 新增 association subprocess.run([ "sacctmgr", "-i", "create", "user", username, "defaultaccount", account, "partition", partition ]) # 立即觸發 controller 重新讀取 database subprocess.run(["scontrol", "reconfigure"]) ``` 這樣可以確保: 1. Association 變更立即生效 2. User 不會遇到 cache 導致的失敗 3. 不需要重啟 slurmctld --- ### 總結 **失敗的原因**是:user 在 association 建立前執行了 `srun`,導致 Slurm controller 產生 negative cache,即使後續新增了正確的 association,cache 仍未更新。 **最佳解法**:在程式中自動執行 `scontrol reconfigure` 來強制更新 cache。 <br> --- <br> ### [重要] 無法變更 account 資訊? --> Slurm 的設計限制:無法直接修改使用者的 account - ### 問題:無法將 account=tp 變更為 account=tn? ``` $ sacctmgr show user --ass where user=tj_tsai@asus.com User Def Acct Admin Cluster Account Partition Share Priority MaxJobs MaxNodes MaxCPUs MaxSubmit MaxWall MaxCPUMins QOS Def QOS ------- ---------- --------- ---------- ---------- ---------- --------- ---------- ------- -------- -------- --------- ----------- ----------- -------------------- --------- tj_tsai tp None slurm_slu+ tp cpu-set 1 normal $ sacctmgr modify user set account=tn where user=tj_tsai@asus.com Unknown option: account=tn Use keyword 'where' to modify condition $ sacctmgr modify user set account=tn where user=tj_tsai@asus.com account=tp Unknown option: account=tn Use keyword 'where' to modify condition ``` - ### 快速解法 - 修改 account 欄位作法: - 步驟 1: 建立新的 association - 步驟 2: 更新 DefaultAccount - 步驟 3: 刪除舊的 association 目的:確保 user 始終至少有一個有效的 association - ### 詳細解法 > codebase: https://github.com/SchedMD/slurm > by `us.anthropic.claude-sonnet-4-5-20250929-v1:0` (2026/01/21) 根據以上分析,我現在理解問題所在了。讓我總結一下: ### **問題根因分析** 根據 Slurm 原始碼和官方文件,**無法直接修改使用者的 account**。這是 Slurm 的設計限制。 ### **關鍵發現** 從 `doc/man/man1/sacctmgr.1:3744-3746` 可以看到明確說明: ``` A user's account can not be changed directly. A new association needs to be created for the user with the new account. Then the association with the old account can be deleted. ``` **中文翻譯:** 「使用者的帳號無法直接變更。需要為使用者建立一個新的關聯(association)到新帳號,然後刪除與舊帳號的關聯。」 ### **可修改的欄位** 從 `src/sacctmgr/user_functions.c:328-415` 的 `_set_rec` 函數可以看到,`sacctmgr modify user set` 只能修改以下欄位: 1. **AdminLevel** - 管理員權限層級 2. **DefaultAccount** - 預設帳號(但不是 association 的 account) 3. **DefaultWCKey** - 預設工作鍵 4. **NewName** - 重新命名使用者 5. **RawUsage** - 原始使用量 6. **Association 相關欄位** (如 fairshare, maxjobs, qos 等) **注意:`account` 欄位不在可修改清單中!** ### **為何出現 "Unknown option: account=tn" 錯誤** 在 `src/sacctmgr/user_functions.c:405-408` 中: ```c } else { exit_code=1; fprintf(stderr, " Unknown option: %s\n" " Use keyword 'where' to modify condition\n", argv[i]); } ``` 當你嘗試使用 `set account=tn` 時,因為 `account` 不是可修改的欄位,所以會觸發 "Unknown option" 錯誤。 --- ## **正確的解決方案** 要將使用者從 `tp` 帳號變更為 `tn` 帳號,需要執行以下步驟: ### **步驟 1: 建立新的 association** ```bash sacctmgr add user tj_tsai@asus.com account=tn cluster=slurm_slurm ``` ### **步驟 2: 如果需要,更新 DefaultAccount** ```bash sacctmgr modify user tj_tsai@asus.com set defaultaccount=tn ``` ### **步驟 3: 刪除舊的 association** ```bash sacctmgr delete user tj_tsai@asus.com account=tp cluster=slurm_slurm ``` ### **驗證結果** ```bash sacctmgr show user --ass where user=tj_tsai@asus.com ``` --- ## **重要注意事項** 1. **執行順序很重要**:必須先建立新 association,再刪除舊的,以確保使用者始終有至少一個有效的 association 2. **如果使用者有執行中的任務**:可能需要等待任務完成後再刪除舊 association,避免影響現有任務 3. **權限限制**:這些操作需要 Slurm 管理員權限(admin level) 4. **Cluster 指定**:如果有多個 cluster,需要為每個 cluster 分別執行這些步驟 這個設計是 Slurm 刻意為之,因為 user-account 的關聯(association)是 Slurm 會計系統的核心概念,需要明確的建立和刪除操作來維護審計追蹤。 --- --- <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 %}