[資源管理] Slurm QoS (Quality of Service) === ###### tags: `Slurm / 資源管理` ###### tags: `Slurm`, `HPC`, `Linux`, `Slinky`, `SlinkyProject`, `Account`, `Accounting`, `SlurmDBD`, `Account`, `Association`, `Partition`, `QoS`, `ResourceLimits`, `TRES`, `Priority`, `Preemption`, `sacctmgr`, `scontrol`, `sbatch`, `srun`, `salloc`, `squeue`, `sinfo` <br> [TOC] <br> ## docs - [[TWCC] Slurm 佇列 (Partition)](https://man.twcc.ai/@f1-manual/partition) - 每位用戶可同時執行工作數 - 每位用戶可派送工作數 - [[TWCC] 12. 服務品質 (QOS)](https://man.twcc.ai/@f1-manual/slurm_instructions#12-%E6%9C%8D%E5%8B%99%E5%93%81%E8%B3%AA-QOS) <br> --- <br> ## 介紹 <!-- http://10.78.26.44:30000/deepwiki/slurm/-/issues/35 --> > - codebase: https://github.com/SchedMD/slurm > - by `us.anthropic.claude-sonnet-4-5-20250929-v1:0` (2026/01/27) ### 什麼是 QoS? **QoS (Quality of Service)** 是 Slurm 中用來**控制和限制資源使用**的機制。它可以設定不同的服務等級,對不同用戶、群組或專案提供差異化的資源存取策略。 > 正確應為:對不同 user、account 或 partition 提供差異化的資源存取策略 ### 主要用途 1. **資源配額管理** - 限制 CPU、記憶體、節點數量等 2. **優先權控制** - 決定作業排程順序 3. **公平性保證** - 確保資源公平分配 4. **服務分級** - 提供高級/標準/經濟等不同服務等級 ### 如何使用? #### 1. 建立 QoS ```bash # 建立一個名為 high_priority 的 QoS sacctmgr add qos high_priority # 建立帶參數的 QoS sacctmgr add qos normal \ Priority=100 \ MaxWall=24:00:00 \ MaxJobsPerUser=10 \ MaxSubmitJobsPerUser=50 ``` #### 2. 查看 QoS ```bash # 列出所有 QoS sacctmgr show qos # 查看特定 QoS 詳細資訊 sacctmgr show qos normal format=name,priority,maxwall,maxjobspu ``` #### 3. 套用 QoS QoS 可以套用到: - **使用者 (User)** - **帳號/專案 (Account)** - **分區 (Partition)** ```bash # 套用到使用者 sacctmgr modify user username set qos=high_priority # 套用到帳號 sacctmgr modify account projectA set qos=normal # 套用到分區(在 slurm.conf) # PartitionName=gpu QoS=gpu_qos ``` #### 4. 使用者提交作業時指定 QoS ```bash # 使用特定 QoS 提交作業 sbatch --qos=high_priority job_script.sh # 或在腳本中指定 #SBATCH --qos=high_priority ``` ### 不同場景設定案例 - ### 場景 1:研究團隊分級服務 **需求**:提供三種服務等級 - VIP/標準/經濟 ```bash # 1. VIP - 高優先權,長時間,多資源 sacctmgr add qos vip \ Priority=1000 \ MaxWall=7-00:00:00 \ MaxCPUsPerUser=512 \ MaxJobsPerUser=20 \ Preempt=normal,economy # --- # 使用 Preempt,要先設定 normal 和 economy 的 QoS # 否則會有錯誤訊息: # sacctmgr: error: You gave a bad qos 'normal'. Valid QOS's are (null) # 2. 標準 - 中等優先權,適中限制 sacctmgr add qos normal \ Priority=500 \ MaxWall=2-00:00:00 \ MaxCPUsPerUser=256 \ MaxJobsPerUser=15 # 3. 經濟 - 低優先權,短時間,少資源 sacctmgr add qos economy \ Priority=100 \ MaxWall=12:00:00 \ MaxCPUsPerUser=64 \ MaxJobsPerUser=5 # 套用到不同團隊 sacctmgr modify account lab_A set qos=vip sacctmgr modify account lab_B set qos=normal sacctmgr modify account lab_C set qos=economy ``` **套用對象**:Account (研究實驗室帳號) **設定位置**:SlurmDB (使用 sacctmgr) --- - ### 場景 2:GPU 資源專用管理 **需求**:GPU 節點需要特殊配額和時間限制 ```bash # 建立 GPU 專用 QoS sacctmgr add qos gpu_short \ Priority=800 \ MaxWall=4:00:00 \ MaxTRESPerUser=gres/gpu=4 \ MaxJobsPerUser=2 sacctmgr add qos gpu_long \ Priority=400 \ MaxWall=48:00:00 \ MaxTRESPerUser=gres/gpu=2 \ MaxJobsPerUser=1 # 在 slurm.conf 設定 partition 的 QoS # PartitionName=gpu_partition Nodes=gpu[01-10] QoS=gpu_long # 允許特定使用者使用 sacctmgr modify user alice set qos+=gpu_short,gpu_long ``` **套用對象**:User (個別使用者) + Partition (GPU 分區) **設定位置**:SlurmDB (sacctmgr) + slurm.conf (Partition 配置) --- - ### 場景 3:防止資源壟斷 **需求**:限制單一使用者/群組不能佔用過多資源 ```bash # 建立公平使用 QoS sacctmgr add qos fair_share \ Priority=500 \ MaxWall=24:00:00 \ MaxCPUsPerUser=128 \ MaxJobsPerUser=10 \ MaxSubmitJobsPerUser=30 \ GrpCPUs=1024 \ GrpJobs=50 # 套用到整個 Account(會影響該 Account 下所有使用者) sacctmgr modify account shared_resources set qos=fair_share ``` **套用對象**:Account (共享資源帳號) **設定位置**:SlurmDB (sacctmgr) --- - ### 場景 4:緊急作業優先處理 **需求**:提供緊急作業快速通道,可以搶佔 (preempt) 低優先權作業 ```bash # 建立緊急 QoS(可以搶佔其他作業) sacctmgr add qos urgent \ Priority=10000 \ MaxWall=2:00:00 \ MaxJobsPerUser=1 \ Preempt=normal,economy Flags=OverPartQOS # 建立可被搶佔的 QoS sacctmgr add qos normal \ Priority=500 \ MaxWall=24:00:00 \ \ PreemptMode=requeue # 只允許管理員或特定使用者使用緊急 QoS sacctmgr modify user admin set qos+=urgent ``` **套用對象**:User (特定授權使用者) **設定位置**:SlurmDB (sacctmgr) --- - ### 場景 5: 依時段差異化計費 **需求**: 尖峰時段使用較貴,離峰時段較便宜 ```bash # 尖峰時段 QoS(高計費倍率) sacctmgr add qos peak_hours \ Priority=600 \ UsageFactor=2.0 # 離峰時段 QoS(低計費倍率) sacctmgr add qos off_peak \ Priority=400 \ UsageFactor=0.5 # 套用到所有使用者,讓他們自行選擇 sacctmgr modify account default set qos+=peak_hours,off_peak # 使用者提交時選擇 sbatch --qos=off_peak night_job.sh ``` **套用對象**: Account (預設帳號,所有使用者可用) **設定位置**: SlurmDB (sacctmgr) --- ### QoS 常用參數說明 | 參數 | 說明 | |------|------| | `Priority` | 優先權數值 (越高越優先) | | `MaxWall` | 最大執行時間 (格式: DD-HH:MM:SS) | | `MaxCPUsPerUser` | 每使用者最大 CPU 數 | | `MaxJobsPerUser` | 每使用者最大同時執行作業數 | | `MaxSubmitJobsPerUser` | 每使用者最大排隊作業數 | | `MaxTRESPerUser` | 每使用者最大 TRES 資源 (如 GPU) | | `GrpCPUs` | 群組總 CPU 上限 | | `GrpJobs` | 群組總作業數上限 | | `Preempt` | 可以搶佔的 QoS 列表 | | `PreemptMode` | 搶佔模式 (suspend/requeue/cancel) | | `UsageFactor` | 計費倍率 | | `Flags` | 特殊旗標 (如 OverPartQOS) | ### 檢視目前 QoS 配置 ```bash # 查看所有 QoS sacctmgr show qos format=name,priority,maxwall,maxjobspu,maxsubmitpu # 查看使用者的 QoS sacctmgr show user username format=user,account,qos # 查看作業使用的 QoS scontrol show job <job_id> | grep QOS ``` ### 總結 - **QoS 套用對象**: User、Account、Partition - **設定位置**: 主要在 SlurmDB (使用 `sacctmgr`),Partition QoS 在 `slurm.conf` - **使用方式**: 提交作業時用 `--qos` 指定,或由系統自動套用預設 QoS - **核心概念**: 透過優先權、資源限制、搶佔機制達到資源管理目標 <br> --- <br> ## QoS 指令 ### 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> --- <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> --- <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> ## 討論 ### Slurm QoS 用途為何?怎麼使用? - ### gpt-5.2 (2026/01/06) 下面用「使用者視角 + 管理者視角」把 **Slurm QoS(Quality of Service,服務品質)**講清楚:它**用來把工作分級**,並把不同等級套用到**排程優先順序、搶佔(preemption)、資源/配額限制**三大類規則。([slurm.schedmd.com][20260106-A-1]) --- ### QoS 是什麼、解決什麼問題? #### 核心概念 * 每個 job 都可以指定一個 QoS。([slurm.schedmd.com][20260106-A-1]) * QoS 由管理者在 **SlurmDB(透過 `sacctmgr`)** 定義,使用者在提交 job 時用 `--qos=` 來要求。([slurm.schedmd.com][20260106-A-1]) #### QoS 會影響 job 的三件事 Slurm 官方文件把 QoS 對 job 的影響歸納為三大項:([slurm.schedmd.com][20260106-A-1]) 1. **排程優先順序(priority)**:同樣資源需求下,高 QoS 可以排更前面。([slurm.schedmd.com][20260106-A-1]) 2. **搶佔(preemption)**:高 QoS 的排隊 job 可以把低 QoS 的執行中 job 暫停/重排/取消,釋放資源給自己。([slurm.schedmd.com][20260106-A-1]) 3. **資源限制(limits / quotas)**:例如限制每個 QoS 最多可用多少 CPU/GPU、最多跑多久、最多同時跑幾個 job、TRES-minutes 配額等;而且 QoS 的限制通常**優先於 association(帳務關聯)**的限制。([slurm.schedmd.com][20260106-A-1]) --- ### 沒有 QoS 會怎樣? 視你「有沒有啟用 enforcement」而定: #### 1) 你不要求一定要指定 QoS(沒設 `AccountingStorageEnforce=qos`) 那使用者通常就走預設策略:job 仍會依 partition/其他排程政策執行。官方 accounting 文件也提到:**不設定 AccountingStorageEnforce 時,job 會依每個 cluster 既有政策執行**。([slurm.schedmd.com][20260106-A-2]) > 這種情況下,QoS 可能只是「可選標籤」,不用也不會擋 job。 #### 2) 你要求一定要是有效 QoS(設 `AccountingStorageEnforce` 包含 `qos`) 當你把 `AccountingStorageEnforce` 包含 `qos` 時,使用者會被限制只能用「自己 association 被允許的 QoS」。([slurm.schedmd.com][20260106-A-3]) > 沒指定、或指定了不允許/不存在的 QoS,就可能提交失敗或一直 pending(依你的設定與限制而定)。 --- ### QoS 怎麼用? ### A. 使用者怎麼指定 QoS 常見三種指令都能指定: * `sbatch --qos=<qos>` * `salloc --qos=<qos>` * `srun --qos=<qos>`(`srun` 也有 `-q` 短參數)([slurm.schedmd.com][20260106-A-1]) 例:sbatch 腳本 ```bash #SBATCH --account=projA #SBATCH --partition=gpu #SBATCH --qos=high ``` `srun` 也可以一次給多個 QoS(逗號分隔,會按 QoS priority 排序,先用最高的)。([slurm.schedmd.com][20260106-A-3]) ```bash srun --qos=high,normal -G 1 python train.py ``` --- ### B. 管理者怎麼建立/配置 QoS(典型流程) > QoS/association 這套通常需要 SlurmDBD 與 accounting_storage/slurmdbd。官方 resource_limits 文件也說明:排程政策資訊需要存到 DB,並建議用 SlurmDBD。([slurm.schedmd.com][20260106-A-4]) 1. **建立 QoS(用 `sacctmgr`)** QoS 定義在資料庫中,用 `sacctmgr` 管。([slurm.schedmd.com][20260106-A-1]) (示意) ```bash # 建一個高優先 QoS sacctmgr add qos high priority=100 # 建一個低優先、可被搶佔的 QoS sacctmgr add qos low priority=10 ``` 2. **設定 QoS 的限制(limits/quotas)** 例如:每個 job 最長時間、每個 job 最多 GPU、群組總量上限(GrpTRES / GrpTRESMins…)等。QoS 的限制會套用到 job,且可優先於 association 限制。([slurm.schedmd.com][20260106-A-1]) 3. **(可選)設定搶佔規則** * 若要用 QoS 來決定搶佔,`slurm.conf` 的 `PreemptType` 需用 `preempt/qos`。([slurm.schedmd.com][20260106-A-1]) * 然後在 QoS 上設定它能搶佔哪些 QoS(qos.html 有描述此機制)。([slurm.schedmd.com][20260106-A-1]) 4. **把 QoS 掛到使用者/帳戶的 association(允許哪些 QoS)** 使用者是否能用某個 QoS,是由 association(user/cluster/account…)允許集合決定;並且當 `AccountingStorageEnforce` 包含 `qos` 時會被強制遵守。([slurm.schedmd.com][20260106-A-3]) 5. **(可選)要求所有人都必須用有效 QoS** 把 `AccountingStorageEnforce` 設定包含 `qos`。這能避免大家「隨便亂填 QoS」或繞過分級策略。([slurm.schedmd.com][20260106-A-3]) --- ### 常被忽略但很關鍵的細節 #### 1) Partition QoS ≠ Job QoS 你可以把 QoS 掛在 partition 上,變成「這個 partition 的限制模板」。但它**不會自動把 job 視為使用該 QoS**、也不給 job 那個 QoS 的 priority/搶佔特性;job 仍可再另外 `--qos=` 來拿 priority/搶佔特性。([slurm.schedmd.com][20260106-A-1]) #### 2) 限制的套用優先順序(誰蓋過誰) 官方列的層級(簡化):**Partition QoS → Job QoS → User association → Account association → … → Partition limit**。([slurm.schedmd.com][20260106-A-4]) > 這會影響你除錯:為什麼你在 QoS 設了限制卻看起來沒生效,常常是被更上層/更優先的地方蓋掉。 #### 3) QoS 的「優先順序」要真的影響排程,還要開權重 QoS priority 只有在使用 multifactor priority(`priority/multifactor`)且 `PriorityWeightQOS` 設為 >0 時,才會進入計算。([slurm.schedmd.com][20260106-A-1]) --- 如果你願意貼你目前的目標(例如:要做「高優先可搶佔低優先」、或「不同專案 GPU 配額」、或「互動/批次分級」),我可以直接給你一套 **QoS + association + AccountingStorageEnforce +(必要時)PreemptType** 的最小可行設定與 `sacctmgr` 指令範本。 [20260106-A-1]: https://slurm.schedmd.com/qos.html "Slurm Workload Manager - Quality of Service (QOS)" [20260106-A-2]: https://slurm.schedmd.com/accounting.html "Slurm Workload Manager - Accounting and Resource Limits" [20260106-A-3]: https://slurm.schedmd.com/srun.html "Slurm Workload Manager - srun" [20260106-A-4]: https://slurm.schedmd.com/resource_limits.html "Slurm Workload Manager - Resource Limits" <br> {%hackmd vaaMgNRPS4KGJDSFG0ZE0w %}