如何让大作业在SBATCH数组作业的批次之间优先执行?
解决Slurm数组作业与大作业资源冲突的方法
方法1:分批提交数组,中间留空给大作业
别一次性提交10000个数组任务,写个循环脚本分批提交,每批跑完后先检查队列里有没有等待的128CPU大作业,有就等它跑完再提交下一批。
示例脚本:
#!/bin/bash 总任务数=10000 每批任务数=280 for (( 起始ID=0; 起始ID<总任务数; 起始ID+=每批任务数 )); do 结束ID=$(( 起始ID + 每批任务数 - 1 )) if (( 结束ID > 总任务数 )); then 结束ID=$总任务数 fi # 提交当前批次数组作业 作业ID=$(sbatch --array=$起始ID-$结束ID%$每批任务数 你的作业脚本.sh | awk '{print $4}') # 等待当前批次任务全部完成 until ! squeue -h -j $作业ID &>/dev/null; do sleep 30 done # 检查是否有等待的128CPU大作业 while squeue -h -t PD -o "%C" | grep -q "^128$"; do echo "等待128CPU大作业执行..." sleep 60 done done
方法2:利用优先级抢占(需集群支持)
如果你的集群开启了作业抢占功能,给数组任务设置更低优先级,让大作业能抢占资源:
- 在数组作业脚本中添加
#SBATCH --nice=100(nice值越大,作业优先级越低) - 大作业使用默认或更低的nice值(比如
--nice=0)
当大作业提交后,Slurm会终止部分正在运行的数组任务,为大作业腾出128个CPU资源。被终止的数组任务会在大作业完成后自动重启(需要你的作业脚本支持断点续跑,否则会从头执行)。
方法3:动态调整数组并发数
写个后台监控脚本,平时让数组用满280个CPU;当检测到有大作业排队时,把数组的最大并发数调整为152(280-128),留出资源给大作业;等大作业跑完后,再将并发数调回280。
示例监控脚本:
#!/bin/bash 数组作业ID=<你的数组作业ID> 总CPU数=280 大作业所需CPU=128 while true; do # 检查是否有等待的128CPU大作业 if squeue -h -t PD -o "%C" | grep -q "^$大作业所需CPU$"; then scontrol update job=$数组作业ID arraytaskmax=$((总CPU数 - 大作业所需CPU)) else scontrol update job=$数组作业ID arraytaskmax=$总CPU数 fi sleep 30 done
注意:该方法需要你拥有修改作业属性的权限,且脚本需后台持续运行。
内容的提问来源于stack exchange,提问作者HaPo
相关产品推荐
相关产品推荐

