我的问题基于THIS问题。
我应该考虑使用--array=0-60000%200
将并行运行的作业数限制为200。在我看来,每当完成一项旧工作时,要花一分钟的时间来吃一份新工作。考虑到我计划运行的工作数量,我可能会这样浪费很多时间。
我写了一个“最有可能”的效率很低的替代方案,其中包括一个脚本,用于启动作业,检查队列中的作业数并在我仍然允许最大作业数的同时添加作业( 我达到了并行作业的最大数量,睡眠5秒,如下所示:
#!/bin/bash
# iterate procedure $1 times. $1=60000
for ((i=0;i<=$1;i++))
do
# wait until any queued process is finished
q=$(squeue -u myuserName | wc -l) #I don't care about +/-1 lines (e.g. title)
while [ $q -gt 200 ] #max number of parallel jobs set to 200
do
sleep 5
q=$(squeue -u myuserName | wc -l)
done
# run the job with sbatch
sbatch...
done
与我以前的方法相比,它似乎做得更好, 我想知道这种实施实际上效率低下吗?为什么呢? 我会损害同一集群上其他用户的调度效率吗?
谢谢。
答案 0 :(得分:1)
SLURM需要一些时间来处理作业列表,并确定下一个要运行的作业,特别是如果回填计划程序到位并且队列中有很多作业的话。您不会因为使用作业阵列而浪费一分钟的时间来安排作业,是SLURM需要一分钟的时间来决定,并且无论是否有作业阵列,任何其他用户的任何其他作业都需要相同的分钟。 / p>
通过使用您的方法,您的工作也失去了优先级:每当一项工作完成时,您就启动一个新工作,而该新工作将成为队列中的最后一个。而且,SLURM将必须管理数百个独立的工作,而不是仅管理一个可以满足您所需的60000个工作。
如果您一个人在集群中,也许两种方法都没有太大区别,但是如果您的集群已满,那么手动方法将给SLURM带来稍高的负担,并且与作业数组近似值(只是因为作业数组,一旦数组排在第一行,则60000排在第一行,而每次完成一个作业时,排在最后一行)。