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

Slurm调度场景下sbatch脚本内srun命令被忽略的原因咨询

问题核心成因
  • 主脚本未等待后台任务执行就提前退出:循环中所有srun命令都通过&放入后台运行,脚本执行完循环后没有调用wait命令等待子进程结束,主进程运行到脚本末尾直接退出。Slurm会在作业主进程终止时,立刻回收该作业分配到的全部资源、杀死所有关联子进程,4个plink任务刚被拉起就被终止,自然没有业务输出。
  • srun参数存在资源竞争冲突:SBATCH头为整个作业申请了4个任务槽,但是每个srun都携带--exclusive参数,该参数在作业内部生效时会要求srun独占分配给作业的全部可用资源,4个同时启动的srun会互相等待对方释放资源,全部处于阻塞挂起状态,根本无法启动plink进程。
  • 输出与错误日志未分离:默认配置下Slurm会把作业的标准输出、标准错误都写到同一个slurm-作业号.out文件中,如果srun启动失败、plink运行报错,错误信息可能因为缓冲、进程被强杀等原因没有及时刷入日志文件,导致只能看到echo输出的4行启动提示。
可直接使用的修复脚本
#!/usr/bin/env bash

#SBATCH --job-name=parallel-plink
#SBATCH --mem=400GB
#SBATCH --ntasks=4
#SBATCH --cpus-per-task=1
#SBATCH --output=slurm-%j.out
#SBATCH --error=slurm-%j.err

cd ~/RS1
for n in {1..4};
do
  echo "Starting ${n}"
  # 移除--exclusive参数避免作业内部资源竞争,预留少量内存避免触发OOM
  srun --input none --ntasks=1 -c 1 --mem-per-cpu=100G \
    plink --memory 95000 --bfile RS1 --distance triangle bin \
    --parallel ${n} 4 --out dt-output &
done
# 阻塞等待所有后台srun任务执行完成后再退出主脚本
wait
补充排查手段

如果修改后任务仍异常,可以通过以下方式定位问题:

  • 执行sacct -j <你的作业号> --format=JobID,JobName,State,ExitCode,MaxRSS查看每个srun子任务的运行状态、退出码、实际内存使用,确认是启动失败、被OOM杀死还是正常退出。
  • 临时把srun替换为直接执行plink命令(保留&和wait),确认并行逻辑本身在Slurm作业环境内可正常运行。
  • 检查Slurm节点的cgroup配置,确认内存、CPU核数限制规则正确,没有出现资源分配值和实际cgroup限制值不匹配的问题。

内容的提问来源于stack exchange,提问作者mve

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 10:39:17