全部產品
Search
文件中心

Container Service for Kubernetes:設定Slurm隊列優先順序

更新時間:May 07, 2025

為了更有效地管理和分配資源,最佳化作業調度,提升系統利用率,並滿足多樣化的作業需求,隊列成為任務調度中不可或缺的配置項。合理的隊列設定能夠確保高優先順序的任務優先獲得所需資源,從而最大化資源利用效率。本文介紹在Slurm系統內容下,當出現作業提交或作業狀態變化時,如何通過恰當的隊列配置策略來實現儘可能多的任務調度處理,以達到最佳效能。

1. Slurm核心功能

  • 資源分派:按需分配CPU/記憶體/GPU等資源,避免衝突與浪費;

  • 作業調度:動態調度作業隊列,按優先順序執行並全程監控任務狀態;

  • 優先順序控制:高優先順序隊列任務優先調度;

  • 監控工具:通過scontrol/sacct監控資源使用及作業狀態;

  • 定製化支援:多隊列適配不同需求(如CPU密集/記憶體/GPU任務);

  • 系統最佳化:提升資源使用率,減少空閑時間,提高計算效率。

說明

本文基於Slurm 24.05版本進行總結,其他版本可能存在差異。

2. Slurm隊列類型

Slurm任務按優先順序排序執行,若分區存在不可調度任務,則後續任務暫停。高優先順序任務可搶佔低優先順序任務資源,被搶佔任務可以取消、重設或掛起。如果您啟用回填調度(預設),按bf_interval周期計算低優任務能否在不延遲高優任務前提下運行,需佔用整機資源並可能觸發整機搶佔。調度配置通過slurm.conf指定SchedulerType(預設sched/backfill外掛程式)及詳細參數SchedulerParameters,具體參數配置,請參見官方文檔

在調度過程中,所有任務都會被整合到一個列表中,並通過不同的優先順序演算法來確定執行順序。Slurm支援以下兩種隊列類型:

  • 先進先出(FIFO)隊列,任務的排序依據是它們提交的時間順序。

  • 多因素(MultiFactors)隊列,是一種更進階的任務排隊機制,預設處於啟用狀態,它能夠根據多個因素綜合計算作業的優先順序。

2.1 先進先出隊列

預設情況下,Slurm採用先進先出FIFO為基礎分配作業優先順序。關於優先順序調度的設定檔存放在slurm.conf中,可以通過修改參數PriorityType來配置優先順序。

# 1.找到並編輯slurm.conf檔案
sudo nano /etc/slurm-llnl/slurm.conf

# 2.啟用搶佔模式,並指定基於先進先出優先順序的搶佔策略
PriorityType=priority/basic 
重要

建議您在變更之前備份原始的slurm.conf檔案,以防萬一出現問題時能夠恢複。此外,對於生產環境中的任何重大改動,建議先在一個測試環境中進行全面測試。

2.2 多因素作業隊列

Slurm多因素調度通過加權計算以下因子確定任務優先順序:作業執行時間長度、資源差異(已指派vs已消耗)、作業規模、使用者參數、資料分區、TRES(資源等價值)類型及服務品質(QOS)。權重分配與具體計算邏輯,請參見多因素優先順序配置說明

Job_priority =
	site_factor +
	(PriorityWeightAge) * (age_factor) +
	(PriorityWeightAssoc) * (assoc_factor) +
	(PriorityWeightFairshare) * (fair-share_factor) +
	(PriorityWeightJobSize) * (job_size_factor) +
	(PriorityWeightPartition) * (priority_job_factor) +
	(PriorityWeightQOS) * (QOS_factor) +
	SUM(TRES_weight_cpu * TRES_factor_cpu,
	    TRES_weight_<type> * TRES_factor_<type>,
	    ...)
	- nice_factor
說明

Slurm作業優先順序通過以下加權因子計算:

  • 基礎值:site_factor(自訂分值)。

  • 作業等待時間權重:作業等待時間越長,權重越高(PriorityWeightAge × age_factor)。

  • 關聯權重:使用者組/賬戶的資源使用公平性(PriorityWeightAssoc × assoc_factor)。

  • 公平共用權重:按資源使用比例調整分值(PriorityWeightFairshare × fair-share_factor)。

  • 作業大小權重:小/大作業優先(PriorityWeightJobSize × job_size_factor)。

  • 分區權重:分區優先順序(PriorityWeightPartition × priority_job_factor)。

  • QoS權重:服務品質等級(PriorityWeightQOS × QOS_factor)。

  • 資源權重:資源類型(CPU/GPU等)權重加權。

  • Nice降級:- nice_factor(數值越大,優先順序越低)。

您可以通過動態調整權重參數,實現公平、高效的任務調度。

典型應用樣本。

  • 快速完成小作業:

    設定 PriorityWeightJobSize=-1,大作業的優先順序降低,小作業更快被調度。

  • 保障關鍵使用者/組:

    通過 PriorityWeightAssoc 和 Fair-share_factor 確保重要團隊的作業優先運行。

  • 資源饑餓保護:

    配置 PriorityWeightFairshare=2000,低資源使用量的使用者作業優先順序顯著提升。

樣本:設定多因素作業優先順序

自訂設定分區優先順序

Slurm可通過組織架構劃分機器,限制任務僅在所屬資源集區運行。任務分緊急(搶佔低優先順序任務)與非緊急(快速執行但不阻塞緊急任務)。當任務接近截止時間需標記為緊急時,Slurm無法自動調整,需人工手動遷移至高優先順序隊列。

您可以建立兩個指向同一節點池的分區(區分緊急/非緊急任務),通過切換任務所屬分區實現優先順序動態調整,提升資源使用率並簡化營運。支援靈活調度動態負載,同時降低管理複雜度。不僅可以讓系統更好地適應動態變化的工作負載需求,同時也簡化了營運人員對複雜作業環境下的管理工作,您可參考以下步驟進行設定。

  1. 首先在叢集中開啟搶佔功能開關,並將搶佔類型設定為preempt/partition_prio

    # 1.找到並編輯slurm.conf檔案
    sudo nano /etc/slurm-llnl/slurm.conf
    
    # 2.啟用搶佔模式,並指定基於分區優先順序的搶佔策略
    PreemptMode=preempt/partition_prio
       
    # 3.當作業被搶佔時的行為,定義了當一個作業被搶佔時會發生什麼。
    # cancel表示取消該作業;suspend則會暫停它直到資源再次可用。選擇哪個取決於你的需求。
    PreemptType=suspend  # 或者 "cancel"
    重要

    建議您在變更之前備份原始的slurm.conf檔案,以防萬一出現問題時能夠恢複。此外,對於生產環境中的任何重大改動,建議先在一個測試環境中進行全面測試。

    展開查看詳細的參數介紹。

    參數

    推薦值

    作用

    SelectType

    select/cons_tres

    定義資源分派策略,指定如何將任務分配到節點資源上。

    說明

    由slurm cluster建立出的worker使用了dynamic node特性,因此只支援select/cons_tres類型。

    SelectTypeParameters

    CR_Core

    傳遞給SelectType外掛程式的具體參數,控制資源分派細節。

    SchedulerType

    sched/backfill

    指定調度演算法類型,決定任務如何被安排至節點。

    PriorityType

    priority/multifactor

    定義任務優先順序計算規則,決定任務調度順序。

    PreemptMode

    SUSPEND,GANG

    啟用搶佔策略的條件,即決定在什麼情況下允許搶佔運行中的任務。

    說明

    開啟搶佔時,在select/cons_tres類型的select外掛程式下只允許使用SUSPEND、GANG。

    PreemptType

    preempt/partition_prio

    選擇搶佔機制類型,指定具體如何執行搶佔行為。

    說明

    當前支援preempt/qos與preempt/partition_prio,本例中使用分區作為搶佔的依據。

  2. 在叢集中添加一個高優先順序分區,通常可以使用以下命令,或者可以在slurm.conf中新增一條分區記錄。scontrol create partition=hipri PriorityTier=2 nodes=ALL之後即可通過向hipri分區提交任務或者將任務更改到高優分區的方式來實現任務搶佔,以下是任務提交樣本。

    # 1.在slurm叢集中添加一個高優先順序分區
    root@slurm-test-0:/# scontrol create partition=hipri PriorityTier=2 nodes=ALL
    
    # 2.查看當前的叢集分區
    root@slurm-test-0:/# scontrol show partition
    # 結果
    PartitionName=debug
       AllowGroups=ALL AllowAccounts=ALL AllowQos=ALL
       AllocNodes=ALL Default=YES QoS=N/A
       DefaultTime=NONE DisableRootJobs=NO ExclusiveUser=NO GraceTime=0 Hidden=NO
       MaxNodes=UNLIMITED MaxTime=UNLIMITED MinNodes=0 LLN=NO MaxCPUsPerNode=UNLIMITED MaxCPUsPerSocket=UNLIMITED
       Nodes=slurm-test-worker-cpu-0
       PriorityJobFactor=1 PriorityTier=1 RootOnly=NO ReqResv=NO OverSubscribe=FORCE:1
       OverTimeLimit=NONE PreemptMode=GANG,SUSPEND
       State=UP TotalCPUs=4 TotalNodes=1 SelectTypeParameters=NONE
       JobDefaults=(null)
       DefMemPerNode=UNLIMITED MaxMemPerNode=UNLIMITED
       TRES=cpu=4,mem=6401M,node=1,billing=4
       ResumeTimeout=GLOBAL SuspendTimeout=GLOBAL SuspendTime=GLOBAL PowerDownOnIdle=NO
    
    PartitionName=hipri
       AllowGroups=ALL AllowAccounts=ALL AllowQos=ALL
       AllocNodes=ALL Default=NO QoS=N/A
       DefaultTime=NONE DisableRootJobs=NO ExclusiveUser=NO GraceTime=0 Hidden=NO
       MaxNodes=UNLIMITED MaxTime=UNLIMITED MinNodes=1 LLN=NO MaxCPUsPerNode=UNLIMITED MaxCPUsPerSocket=UNLIMITED
       Nodes=slurm-test-worker-cpu-0
       PriorityJobFactor=1 PriorityTier=2 RootOnly=NO ReqResv=NO OverSubscribe=NO
       OverTimeLimit=NONE PreemptMode=GANG,SUSPEND
       State=UP TotalCPUs=0 TotalNodes=0 SelectTypeParameters=NONE
       JobDefaults=(null)
       DefMemPerNode=UNLIMITED MaxMemPerNode=UNLIMITED
       TRES=(null)
       ResumeTimeout=GLOBAL SuspendTimeout=GLOBAL SuspendTime=GLOBAL PowerDownOnIdle=NO
    # 連續提交4個任務
    root@slurm-test-0:/# srun sleep 1d &
    root@slurm-test-0:/# srun sleep 1d &
    root@slurm-test-0:/# srun sleep 1d &
    root@slurm-test-0:/# srun sleep 1d &
    # 查看當前叢集狀態
    root@slurm-test-0:/# squeue
    # 當前叢集有4個正在啟動並執行任務
    JOBID  PARTITION   NAME     USER   ST     TIME  NODES NODELIST(REASON)
        4     debug    sleep     root  R       0:03  1    slurm-test-worker-cpu-0
        2     debug    sleep     root  R       0:04  1    slurm-test-worker-cpu-0
        3     debug    sleep     root  R       0:04  1    slurm-test-worker-cpu-0
        1     debug    sleep     root  R       0:05  1    slurm-test-worker-cpu-0
    # 在高優先順序分區提交任務
    root@slurm-test-0:/# srun --partition=hipri sleep 1d &
    root@slurm-test-0:/# squeue
    # 任務4的ST(狀態)從R變為了S,任務5的狀態變為了R,說明任務4被掛起
     JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
         2     debug    sleep     root  R       1:06      1 slurm-test-worker-cpu-0
         3     debug    sleep     root  R       1:06      1 slurm-test-worker-cpu-0
         1     debug    sleep     root  R       1:07      1 slurm-test-worker-cpu-0
         4     debug    sleep     root  S       0:59      1 slurm-test-worker-cpu-0
         5     hipri    sleep     root  R       0:06      1 slurm-test-worker-cpu-0
    # 提交低優任務
    root@slurm-test-0:/# srun sleep 1d &
    # 更新任務為高優任務
    root@slurm-test-0:/# scontrol update jobid=6 partition=hipri
    root@slurm-test-0:/# squeue
    # 任務1和2變為了掛起狀態,這是由於同分區的任務會共用執行時間,因此1,2,3,4會通過分時的方式執行
     JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
         4     debug    sleep     root  R       3:21      1 slurm-test-worker-cpu-0
         3     debug    sleep     root  R       3:33      1 slurm-test-worker-cpu-0
         2     debug    sleep     root  S       3:41      1 slurm-test-worker-cpu-0
         1     debug    sleep     root  S       4:01      1 slurm-test-worker-cpu-0
         6     hipri    sleep     root  R       0:03      1 slurm-test-worker-cpu-0
         5     hipri    sleep     root  R       3:33      1 slurm-test-worker-cpu-0
    

自訂設定QOS服務品質優先順序

Slurm需配置高/低優先順序QOS(預設已存在優先順序0的normal),並通過sacctmgr建立高優QOS啟用搶佔。需在slurm.conf開啟搶佔功能(如PreemptMode=priority),但需注意:若PreemptType=SUSPEND,GANG,高優任務搶佔後,低優任務會以分時模式與高優任務共存(非完全中斷)。配置QOS需要使用sacctmgr工具,以下是建立一個高優QOS的常用命令。

sacctmgr add qos high preempt=normal preemptmode=gang,suspend priority=10
說明
  • preempt=normal:指定high QoS可搶佔normal QoS的任務。

  • preemptmode=gang,suspend

    • Gang模式:搶佔任務需完全擷取資源後才開始執行。

    • Suspend模式:被搶佔任務暫停而非終止,釋放資源供搶佔者使用,待搶佔任務結束時恢複執行。

  • priority=10high QoS任務預設優先順序基分為10(數值越高優先順序越高)。

在slurm.conf中開啟搶佔相關開關涉及到以下參數,同時在配置Partition時,需要在配置的最後增加OverSubscribe=FORCE:1

展開查看詳細的參數介紹。

參數

推薦值

作用

SelectType

select/cons_tres

定義資源分派策略,指定如何將任務分配到節點資源上。

說明

由slurm cluster建立出的worker使用了dynamic node特性,因此只支援select/cons_tres類型。

SelectTypeParameters

CR_Core

傳遞給SelectType外掛程式的具體參數,控制資源分派細節。

SchedulerType

sched/backfill

指定調度演算法類型,決定任務如何被安排至節點。

PriorityType

priority/multifactor

定義任務優先順序計算規則,決定任務調度順序。

PreemptMode

SUSPEND,GANG

啟用搶佔策略的條件,即決定在什麼情況下允許搶佔運行中的任務。

說明

開啟搶佔時,在select/cons_tres類型的select外掛程式下只允許使用SUSPEND、GANG。

PreemptType

preempt/qos

選擇搶佔機制類型,指定具體如何執行搶佔行為。

說明

當前支援preempt/qos與preempt/partition_prio,本例中使用QOS作為搶佔的依據。

以下是一個使用了不同QoS進行任務搶佔管理的例子:

# 查看當前QOS
root@slurm-test-0:/# sacctmgr show qos format=name
      Name
----------
    normal
# 建立高優QOS
root@slurm-test-0:/# sacctmgr add qos high preempt=normal preemptmode=gang,suspend priority=10
 Adding QOS(s)
  high
 Settings
  Description    = high
  Preempt                  = normal
  PreemptMode              = GANG,SUSPEND
  Priority                 = 10
Would you like to commit changes? (You have 30 seconds to decide)
(N/y): y
# 查看當前QOS
root@slurm-test-0:/# sacctmgr show qos format=name,priority,preempt
      Name   Priority    Preempt
---------- ---------- ----------
    normal          0
      high         10     normal
# test.sh的內容如下
# #!/bin/bash
# srun sleep 10m
# 連續提交五個任務
root@slurm-test-0:/# sbatch test.sh
Submitted batch job 4
root@slurm-test-0:/# sbatch test.sh
Submitted batch job 5
root@slurm-test-0:/# sbatch test.sh
Submitted batch job 6
root@slurm-test-0:/# sbatch test.sh
Submitted batch job 7
root@slurm-test-0:/# sbatch test.sh
Submitted batch job 8
root@slurm-test-0:/# squeue # 任務8處於Pending狀態
 JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
     8     debug  test.sh     root PD       0:00      1 (Resources)
     7     debug  test.sh     root  R       0:03      1 slurm-test-worker-cpu-0
     5     debug  test.sh     root  R       0:15      1 slurm-test-worker-cpu-0
     6     debug  test.sh     root  R       0:15      1 slurm-test-worker-cpu-0
     4     debug  test.sh     root  R       0:18      1 slurm-test-worker-cpu-0
root@slurm-test-0:/# sbatch --qos=high test.sh # 向高優QOS提交任務
Submitted batch job 9
root@slurm-test-0:/# squeue # 高優QOS開始執行,通過分時的方式與其他任務共用資源
 JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
     8     debug  test.sh     root PD       0:00      1 (Resources)
     7     debug  test.sh     root  R       0:26      1 slurm-test-worker-cpu-0
     5     debug  test.sh     root  R       0:38      1 slurm-test-worker-cpu-0
     6     debug  test.sh     root  R       0:38      1 slurm-test-worker-cpu-0
     4     debug  test.sh     root  R       0:41      1 slurm-test-worker-cpu-0
     9     debug  test.sh     root  S       0:00      1 slurm-test-worker-cpu-0

自訂設定作業大小優先順序

作業大小優先順序是由PriorityWeightJobSize和PriorityWeightAge=1000共同決定。

  • 作業大小因素

    非緊急任務需高效利用叢集資源(不超期限)。當任務執行時間未知時,回填調度失效,此時優先調度小任務減少隊頭阻塞,同時依據排隊時間提升大任務優先順序防餓死;臨近截止的大任務可搶佔小任務資源(掛起小任務直至其完成)。

    為提高非緊急任務叢集利用率(不超過截止時間),您可以採取以下策略進行設定:

    • 優先調度小任務減少隊頭阻塞。

    • 按排隊時間長度提升大任務優先順序防餓死。

    • 臨近截止的大任務可搶佔小任務資源(小任務掛起至其完成)。任務執行時間未知時,回填調度失效,需以上機制保障資源高效利用。

    通過實施上述措施,可以在保證關鍵任務按時完成的同時最大化利用叢集資源,同時也兼顧了不同類型任務之間的平衡。

    在slurm.conf中需要進行如下的配置(這裡只展示特殊配置,slurm.conf中的其他配置不受影響):

    PriorityFavorSmall=YES
    PriorityWeightAge=1000
    PriorityWeightJobSize=1000
    PriorityMaxAge=1-0
  • 作業等待時間因素

    當設定完成作業大小優先順序後,提交後等待時間為第二因素。Slurm通過工作要求資源與叢集總資源的佔比計算任務大小得分;若啟用PriorityFavorSmall=YES,得分公式為:得分 = (1 - 資源佔比) × PriorityWeightJobSize。例如,當叢集可用4核CPU時:

    • 請求1核任務得分:(1 - 1/4) × 權重 = 0.75×權重 → 樣本得分為0.375(若權重為0.5)

    • 請求4核任務得0分(完全佔用資源)。

    AgeFactor優先順序計算:

    • 超過PriorityMaxAge的任務:直接得PriorityWeightAge全分。

    • 其他任務按提交時間佔比得分,例如設定PriorityWeightAge=1000時,每分鐘增加約0.69分,累計至24小時後得滿分1000。

    回填調度建議,若可預估任務執行時間,建議啟用預設的回填調度(或手動設定SchedulerType=sched/backfill),使其通過時間表調度小任務填充至大任務空閑時段。結合系統預設的大任務優先機制及臨近截止時間搶佔功能,可平衡資源使用率與公平性。