提交含多并行步骤的Slurm作业遇资源分配异常问题
多步骤Slurm作业无法并行启动全部任务的问题及解决
问题背景
因集群限制单用户最多提交20个作业,选择单作业多步骤方案替代作业数组,目标是在100个核心上并行运行同一程序的100个独立副本。使用的批处理脚本如下:
#!/bin/sh #SBATCH --partition parallel #SBATCH --ntasks=100 #SBATCH --cpus-per-task=1 #SBATCH --mem=1000M #SBATCH --job-name test #SBATCH --output test.out for ((i=0; i<$SLURM_NTASKS; i++)) do srun -N1 -n1 --mem-per-cpu=10M --exact -u sleep 1200 & done wait
遇到的问题
脚本预期资源分配完成后,并行启动100个srun步骤(每个占1个CPU),但实际仅启动10-20个,出现提示:
Step creation temporarily disabled, retrying (Requested nodes are busy)
通过sacct验证资源已分配,但存在两个异常:
.batch步骤占用大量CPU(22核)和超出预期的内存(330M);- 任务步骤集中在单个节点,未分散到已分配的5个节点。
典型sacct输出:
JobID MaxRSS AllocTRES NodeList --------------- ---------- ---------------------------------------- -------------------- 624245 billing=441,cpu=100,mem=1500M,node=5 ibiscohpc-wn[26-30] 624245.batch 408612K cpu=22,mem=330M,node=1 ibiscohpc-wn26 624245.0 632K cpu=1,mem=10M,node=1 ibiscohpc-wn26 624245.1 632K cpu=1,mem=10M,node=1 ibiscohpc-wn27 624245.2 628K cpu=1,mem=10M,node=1 ibiscohpc-wn28 624245.3 632K cpu=1,mem=10M,node=1 ibiscohpc-wn29 624245.4 632K cpu=1,mem=10M,node=1 ibiscohpc-wn30 624245.5 632K cpu=1,mem=10M,node=1 ibiscohpc-wn26 624245.6 636K cpu=1,mem=10M,node=1 ibiscohpc-wn26 624245.7 628K cpu=1,mem=10M,node=1 ibiscohpc-wn26 624245.8 628K cpu=1,mem=10M,node=1 ibiscohpc-wn26 624245.9 636K cpu=1,mem=10M,node=1 ibiscohpc-wn26 624245.10 632K cpu=1,mem=10M,node=1 ibiscohpc-wn26 624245.11 632K cpu=1,mem=10M,node=1 ibiscohpc-wn26 624245.12 628K cpu=1,mem=10M,node=1 ibiscohpc-wn26 624245.13 632K cpu=1,mem=10M,node=1 ibiscohpc-wn26 624245.14 632K cpu=1,mem=10M,node=1 ibiscohpc-wn26 624245.15 632K cpu=1,mem=10M,node=1 ibiscohpc-wn26 624245.16 628K cpu=1,mem=10M,node=1 ibiscohpc-wn26 624245.17 632K cpu=1,mem=10M,node=1 ibiscohpc-wn26 624245.18 628K cpu=1,mem=10M,node=1 ibiscohpc-wn26 624245.19 632K cpu=1,mem=10M,node=1 ibiscohpc-wn26 624245.20 628K cpu=1,mem=10M,node=1 ibiscohpc-wn26 624245.21 632K cpu=1,mem=10M,node=1 ibiscohpc-wn26 624245.22 636K cpu=1,mem=10M,node=1 ibiscohpc-wn26 624245.23 628K cpu=1,mem=10M,node=1 ibiscohpc-wn26 624245.24 628K cpu=1,mem=10M,node=1 ibiscohpc-wn26 624245.25 628K cpu=1,mem=10M,node=1 ibiscohpc-wn26
问题原因及解决措施
1. 批量srun触发控制器限流
循环瞬间发送100个srun步骤创建请求,Slurm控制器会触发限流机制,拒绝部分请求导致任务无法全部启动。
解决: 控制srun启动的并发数,比如用parallel工具分批启动:
#!/bin/sh #SBATCH --partition parallel #SBATCH --ntasks=100 #SBATCH --cpus-per-task=1 #SBATCH --mem-per-cpu=10M #SBATCH --job-name test #SBATCH --output test.out # 按节点数控制并发,避免瞬间发送过多请求 parallel -j5 srun -N1 -n1 --mem-per-cpu=10M --exact -u sleep 1200 ::: $(seq 1 $SLURM_NTASKS)
2. .batch步骤挤占资源
.batch是运行脚本本身的进程,默认会占用作业剩余的所有资源,导致它抢占了22核CPU,挤占了其他任务的资源。
解决: 显式限制.batch的资源,比如在脚本开头用srun启动脚本主体:
#!/bin/sh #SBATCH --partition parallel #SBATCH --ntasks=100 #SBATCH --cpus-per-task=1 #SBATCH --mem-per-cpu=10M #SBATCH --job-name test #SBATCH --output test.out # 限制batch步骤仅用1核100M内存 srun --ntasks=1 --cpus-per-task=1 --mem=100M bash -c ' for ((i=0; i<$SLURM_NTASKS; i++)) do srun -N1 -n1 --mem-per-cpu=10M --exact -u --distribution=block:block sleep 1200 & done wait '
3. 任务集中在单个节点
Slurm默认优先将任务调度到脚本所在节点,导致任务集中。
解决: 添加--distribution=block:block参数强制任务均匀分配到所有节点:
srun -N1 -n1 --mem-per-cpu=10M --exact -u --distribution=block:block sleep 1200 &
4. 优化资源分配参数
将全局--mem=1000M改为--mem-per-cpu=10M,明确每个CPU的内存配额,避免资源分配模糊:
#SBATCH --mem-per-cpu=10M
内容的提问来源于stack exchange,提问作者Christos
相关产品推荐
相关产品推荐

