设置Slurm队列优先级

更新时间:2025-03-25 02:13:36

为了更有效地管理和分配资源,优化作业调度,提升系统利用率,并满足多样化的作业需求,队列成为任务调度中不可或缺的配置项。合理的队列设置能够确保高优先级的任务优先获得所需资源,从而最大化资源利用效率。本文介绍在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/qospreempt/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(默认已存在优先级0normal),并通过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/qospreempt/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

自定义设置作业大小优先级

作业大小优先级是由PriorityWeightJobSizePriorityWeightAge=1000共同决定。

  • 作业大小因素

    非紧急任务需高效利用集群资源(不超期限)。当任务执行时间未知时,回填调度失效,此时优先调度小任务减少队头阻塞,同时依据排队时间提升大任务优先级防饿死;临近截止的大任务可抢占小任务资源(挂起小任务直至其完成)。

    为提高非紧急任务集群利用率(不超过截止时间),您可以采取以下策略进行设置:

    • 优先调度小任务减少队头阻塞。

    • 按排队时长提升大任务优先级防饿死。

    • 临近截止的大任务可抢占小任务资源(小任务挂起至其完成)。任务执行时间未知时,回填调度失效,需以上机制保障资源高效利用。

    通过实施上述措施,可以在保证关键任务按时完成的同时最大化利用集群资源,同时也兼顾了不同类型任务之间的平衡。

    slurm.conf中需要进行如下的配置(这里只展示特殊配置,slurm.conf中的其他配置不受影响):

    PriorityFavorSmall=YES
    PriorityWeightAge=1000
    PriorityWeightJobSize=1000
    PriorityMaxAge=1-0
  • 作业等待时间因素

    当设置完成作业大小优先级后,提交后等待时间为第二因素。Slurm通过任务请求资源与集群总资源的占比计算任务大小得分;若启用PriorityFavorSmall=YES,得分公式为:得分 = (1 - 资源占比) × PriorityWeightJobSize。例如,当集群可用4CPU时:

    • 请求1核任务得分:(1 - 1/4) × 权重 = 0.75×权重 → 示例得分为0.375(若权重为0.5)

    • 请求4核任务得0分(完全占用资源)。

    AgeFactor优先级计算:

    • 超过PriorityMaxAge的任务:直接得PriorityWeightAge全分。

    • 其他任务按提交时间占比得分,例如设置PriorityWeightAge=1000时,每分钟增加约0.69分,累计至24小时后得满分1000。

    回填调度建议,若可预估任务执行时间,建议启用默认的回填调度(或手动配置SchedulerType=sched/backfill),使其通过时间表调度小任务填充至大任务空闲时段。结合系统默认的大任务优先机制及临近截止时间抢占功能,可平衡资源利用率与公平性。

  • 本页导读 (1)
  • 1. Slurm核心功能
  • 2. Slurm队列类型
  • 2.1 先进先出队列
  • 2.2 多因素作业队列
  • 示例:设置多因素作业优先级
  • 自定义设置分区优先级
  • 自定义设置QOS服务质量优先级
  • 自定义设置作业大小优先级
AI助理

点击开启售前

在线咨询服务

你好,我是AI助理

可以解答问题、推荐解决方案等