更新时间:2025-05-21 GMT+08:00

动态调度

动态调度机制能够根据集群实时状态灵活调整作业执行顺序,最大化资源利用率并平衡公平性。

资源动态调度

功能一:支持负载堆积自动扩容/节点闲置自动缩容

  • 没有可用节点时会自动扩容新的局点(达到预设时间)。
  • 节点空闲时间达到预设时间就会自动释放资源(空闲时间设置需要大于300s)。

功能二:设置稳定资源

稳定节点闲置时不会缩容节点处理。

功能三:资源弹性混合供给

可以在一个分区分区创建不同规格计算节点

查看资源调度情况

页面查看计算节点所在分区等情况

作业动态调度

作业调度策略

  1. 回填调度(Backfill Scheduling)
    • 原理:在保证高优先级作业不被延迟的前提下,利用资源空闲间隙运行低优先级小作业。
    • 动态性体现:
      • 实时计算每个作业的预计开始时间(Earliest Start Time, EST)。
      • 扫描队列,寻找能“嵌入”当前资源空闲窗口的作业。
    • 关键依赖:用户需指定准确的作业运行时间(--time参数),否则回填效率下降。
    • 操作示例:
      sbatch -p [分区] --time=00:30:00 job.sh  # 精确指定作业运行时间,便于回填计算
  2. 抢占调度(Preemption)
    • 原理:当高优先级作业提交时,Slurm可终止或挂起低优先级作业以释放资源。
    • 抢占模式

      类型

      行为

      适用场景

      Requeue

      终止低优先级作业并重新排队,稍后自动重启

      长作业且允许中断的场景

      Suspend

      挂起低优先级作业,资源释放后自动恢复

      短时高优先级作业插入

      Cancel

      直接终止低优先级作业

      紧急任务(需谨慎配置)

    • 配置方法
      在QoS或分区中启用抢占策略:
      # 创建允许被抢占的QoS
      sacctmgr add qos low_prio Preempt=high_prio  # high_prio为高优先级QoS名称

  3. 动态优先级调整
    • 公平份额(Fair-share):基于用户/组的历史资源使用量(如过去30天的CPU小时)动态计算优先级权重。

      sshare -l # 查看用户的公平份额因子(FairShare值越低,优先级补偿越高)

    • 实时反馈机制
      • 当用户超额使用资源时,其作业优先级自动下降;反之,未充分使用的用户优先级提升。
      • 权重公式:Priority = f(Age, FairShare, QoS, Partition, ...),每隔数秒重新计算。

动态调度优化策略

  1. 管理员侧配置
    • 启用回填调度

      在 slurm.conf 中设置:

      SchedulerType=sched/backfill  # 使用回填调度器
      SchedulerParameters=bf_max_job_test=100  # 每次调度扫描的最大作业数
    • 配置抢占策略
      # 在slurm.conf中定义全局抢占规则
       PreemptType=preempt/partition_prio  # 按分区优先级抢占
       PreemptMode=SUSPEND                  # 挂起而非终止作业
    • 设置动态优先级权重
      PriorityType=priority/multifactor    # 启用多因素优先级计算
      PriorityWeightFairshare=1000         # 公平份额权重
      PriorityWeightAge=100               # 作业年龄权重
  2. 用户侧优化策略
    • 精确指定资源需求
      sbatch -p [分区] --ntasks=4 --mem=8G --time=1:00:00 job.sh  # 避免过度请求资源
    • 利用QoS提升优先级
      sbatch --qos=urgent job.sh  # 提交到高优先级QoS队列

作业调度监测

  1. 查看回填计划
    scontrol show config | grep Backfill  # 检查回填调度器状态
    sdiag -f | grep "Backfill cycle"      # 查看回填调度周期耗时
  2. 分析抢占事件
    sacct -X -j <job_id> -o JobID,PreemptedBy  # 查看作业被抢占的记录
  3. 实时优先级跟踪
    sprio -w -j <job_id>  # 显示作业各优先级成分的权重得分
  4. 页面查看作业

典型场景与解决方案

场景1:小作业长时间排队

  • 问题:用户提交的短作业因大作业占资源而延迟。
  • 解决:确保启用回填调度,并准确指定 --time 参数。
    sbatch --time=00:10:00 small_job.sh  # 明确运行时间,帮助回填

场景2:紧急任务需立即执行

  • 问题:高优先级作业需快速抢占资源。
  • 解决:配置专用QoS并允许抢占。
    # 管理员配置
    sacctmgr add qos urgent Priority=1000 Preempt=low_prio
    # 用户提交
    sbatch --qos=urgent critical_job.sh

场景3:资源利用率不均

  • 问题:部分节点空闲,但作业仍在排队。
  • 解决:检查分区配置是否限制过严,或调整节点共享策略(如启用 OverSubscribe=YES)。

动态调度的局限性

  • 时间估算偏差:用户低估作业运行时间会导致回填失效,高估则浪费资源窗口。
  • 抢占成本:频繁的作业挂起/重启可能增加系统开销(如检查点机制未启用时)。
  • 配置复杂度:动态调度参数需精细调整(如权重分配、回填深度),不当配置可能降低整体效率。

总结

资源调度通过设置自动扩缩容策略,最大化资源利用。作业动态调度通过回填、抢占和实时优先级调整,实现资源的高效利用。用户应合理指定资源需求和时间限制,管理员需优化调度策略参数(如权重、抢占规则)。