如何让高优先级Slurm作业抢占资源且避免CPU任务共享?
调度需求可行性分析与实现方案
你的调度需求完全可行,核心需要结合Slurm作业数组并发控制、任务依赖管理、优先级配置、抢占机制四个维度实现,同时解决CPU共享问题。以下是具体实现步骤:
一、关键Slurm配置调整(slurm.conf)
确保集群开启抢占、优先级功能,并正确配置节点资源:
# 节点基础配置(2节点,每节点5核) NodeName=node[1-2] CPUs=5 State=UP PartitionName=main Nodes=node[1-2] Default=YES MaxTime=INFINITE State=UP # 抢占机制配置(高优先级作业可抢占低优先级作业,被抢占任务重新排队) PreemptType=sched/builtin PreemptMode=REQUEUE PreemptTypeParameters=ALL # 优先级权重配置(让B组作业优先级远高于A组) PriorityType=priority/multifactor PriorityWeightJobSize=100 # 作业规模权重(可根据需求调整) PriorityWeightAge=-100 # 作业等待时长权重(负数值表示越新的作业优先级越高)
二、任务脚本设计(task.sh)
单个迭代任务需实现a、b并行执行,c等待a/b完成的逻辑,同时强制每个子任务独占1核:
#!/bin/bash #SBATCH --cpus-per-task=1 #SBATCH --mem=100M # 启动子任务a(后台运行,独占1核) srun --cpus-per-task=1 --exclusive stress --cpu 1 --timeout 60s & pid_a=$! # 启动子任务b(后台运行,独占1核) srun --cpus-per-task=1 --exclusive stress --cpu 1 --timeout 60s & pid_b=$! # 等待a、b全部完成后启动c wait $pid_a $pid_b # 启动子任务c(独占1核) srun --cpus-per-task=1 --exclusive stress --cpu 1 --timeout 60s
--exclusive:确保子任务不与其他进程共享CPU核心,解决你遇到的CPU使用率50%的共享问题。wait命令:严格保证c子任务在a、b完成后才启动。
三、作业提交与调度控制
1. 提交A组任务(优先级0,限制并发数)
sbatch --array=1-6%5 --job-name=GroupA --priority=0 task.sh
--array=1-6%5:限制A组最多同时运行5个迭代任务(每个迭代占2核运行a、b),刚好填满10核资源,避免任务过载导致的CPU共享。--priority=0:设置A组基础优先级。
2. 提交B组任务(高优先级,抢占资源)
在A组运行1分钟后(或按需提交),提交B组任务:
sbatch --array=7-14%5 --job-name=GroupB --priority=1000 task.sh
--priority=1000:远高于A组的优先级,触发Slurm抢占机制。--array=7-14%5:同样限制并发数为5,确保满负荷利用10核资源。
四、调度流程匹配说明
- 第1分钟:A组5个迭代的a、b子任务并行运行(占满10核),1分钟后完成a、b。此时B组高优先级作业提交,Slurm会将A组正在执行的c子任务重新排队,释放资源给B组。
- 第2分钟:B组5个迭代的a、b子任务并行运行(占满10核),1分钟后完成。
- 第3分钟:B组剩余3个迭代的a、b(6核)+ 已完成a、b的5个B组迭代的c(5核)?不对,实际会根据Slurm调度策略自动分配剩余资源,优先完成B组任务,同时穿插执行A组的剩余子任务,最终匹配你预期的“完成B组剩余8个子任务与A组2个子任务”。
- 第4分钟:B组任务全部完成后,Slurm调度A组剩余任务执行,1分钟内完成所有剩余子任务。
五、关键问题解决
- CPU共享问题:通过
--cpus-per-task=1+--exclusive强制子任务独占核心,结合--array=X-Y%5限制并发数,避免任务过载。 - 所有迭代同时启停问题:
--array=X-Y%N参数限制了同时运行的数组元素数量,解决了之前全量启动导致的资源竞争。
内容的提问来源于stack exchange,提问作者Sure Not
相关产品推荐
相关产品推荐

