You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

提交含多并行步骤的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验证资源已分配,但存在两个异常:

  1. .batch步骤占用大量CPU(22核)和超出预期的内存(330M);
  2. 任务步骤集中在单个节点,未分散到已分配的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 05:04:50