---
# System prepended metadata

title: '[資源管理] Slurm QoS (Quality of Service)'
tags: [ResourceLimits, scontrol, Association, srun, sinfo, Partition, salloc, Slurm, squeue, Linux, sbatch, Preemption, Slinky, SlurmDBD, Slurm / 資源管理, QoS, SlinkyProject, sacctmgr, TRES, Account, HPC, Accounting, Priority]

---

[資源管理] 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 %}