Slurm sbatch 完整全面指南:所有选项详解
Slurm 是高性能计算(HPC)集群中广泛使用的开源作业调度系统。sbatch
命令用于提交批处理脚本到 Slurm 调度器执行。本指南将详尽介绍 sbatch
的所有选项、参数和使用方法。
目录
- 基本概念
- 命令行选项与
#SBATCH
指令 - 完整选项列表
- 环境变量
- 参数传递
- 实用示例
基本概念
sbatch 的工作机制
sbatch
提交一个批处理脚本到 Slurm 控制器。脚本可以通过文件名指定,如果没有指定文件名,sbatch
将从标准输入读取脚本内容。
两种参数指定方式
- 命令行选项:
sbatch --nodes=2 --time=01:00:00 script.sh
- 脚本内
#SBATCH
指令:在脚本开头添加 #SBATCH
行
优先级:命令行选项会覆盖脚本中的 #SBATCH
指令。
命令行选项与 #SBATCH
指令
所有 sbatch
选项都可以通过两种方式使用:
sbatch --nodes=2 --time=01:00:00 --job-name=myjob script.sh
完整选项列表
账户和权限管理
选项 | 描述 | 示例 |
---|
-A , --account=<account> | 指定计费账户 | #SBATCH --account=myproject |
--qos=<qos> | 服务质量等级 | #SBATCH --qos=high |
--reservation=<name> | 使用预约资源 | #SBATCH --reservation=maintenance |
作业基本信息
选项 | 描述 | 示例 |
---|
-J , --job-name=<name> | 作业名称 | #SBATCH --job-name=data_analysis |
--comment=<string> | 作业注释 | #SBATCH --comment="Data processing job" |
--extra=<string> | 额外字符串(用于节点过滤) | #SBATCH --extra="special_config" |
时间控制
选项 | 描述 | 示例 |
---|
-t , --time=<time> | 最大运行时间 | #SBATCH --time=2-12:30:00 |
--time-min=<time> | 最小运行时间 | #SBATCH --time-min=1:00:00 |
-b , --begin=<time> | 延迟开始时间 | #SBATCH --begin=16:00 |
--deadline=<time> | 截止时间 | #SBATCH --deadline=2023-12-31T23:59:59 |
节点和资源分配
节点选择
选项 | 描述 | 示例 |
---|
-N , --nodes=<minnodes[-maxnodes]> | 节点数量 | #SBATCH --nodes=2-4 |
-w , --nodelist=<node_name_list> | 指定特定节点 | #SBATCH --nodelist=node01,node02 |
-x , --exclude=<node_name_list> | 排除特定节点 | #SBATCH --exclude=node03,node04 |
-C , --constraint=<list> | 节点特性约束 | #SBATCH --constraint="intel&gpu" |
--prefer=<list> | 软约束(首选特性) | #SBATCH --prefer="haswell" |
--contiguous | 要求连续节点 | #SBATCH --contiguous |
任务和CPU分配
选项 | 描述 | 示例 |
---|
-n , --ntasks=<number> | 总任务数 | #SBATCH --ntasks=32 |
--ntasks-per-node=<ntasks> | 每节点任务数 | #SBATCH --ntasks-per-node=16 |
--ntasks-per-socket=<ntasks> | 每插槽任务数 | #SBATCH --ntasks-per-socket=8 |
--ntasks-per-core=<ntasks> | 每核心任务数 | #SBATCH --ntasks-per-core=1 |
-c , --cpus-per-task=<ncpus> | 每任务CPU数 | #SBATCH --cpus-per-task=4 |
硬件规格约束
选项 | 描述 | 示例 |
---|
-B , --extra-node-info=<sockets:cores:threads> | 硬件规格要求 | #SBATCH -B 2:8:2 |
--sockets-per-node=<sockets> | 每节点插槽数 | #SBATCH --sockets-per-node=2 |
--cores-per-socket=<cores> | 每插槽核心数 | #SBATCH --cores-per-socket=8 |
--threads-per-core=<threads> | 每核心线程数 | #SBATCH --threads-per-core=2 |
-S , --core-spec=<num> | 专用核心数 | #SBATCH --core-spec=1 |
--thread-spec=<num> | 专用线程数 | #SBATCH --thread-spec=2 |
内存管理
选项 | 描述 | 示例 |
---|
--mem=<MB> | 每节点总内存 | #SBATCH --mem=8G |
--mem-per-cpu=<MB> | 每CPU内存 | #SBATCH --mem-per-cpu=2G |
--mem-per-gpu=<MB> | 每GPU内存 | #SBATCH --mem-per-gpu=4G |
--tmp=<MB> | 临时磁盘空间 | #SBATCH --tmp=50G |
GPU 和 GRES 资源
选项 | 描述 | 示例 |
---|
-G , --gpus=<list> | GPU总数或类型 | #SBATCH --gpus=4 |
--gpus-per-node=<list> | 每节点GPU数 | #SBATCH --gpus-per-node=2 |
--gpus-per-socket=<list> | 每插槽GPU数 | #SBATCH --gpus-per-socket=1 |
--gpus-per-task=<list> | 每任务GPU数 | #SBATCH --gpus-per-task=1 |
--gres=<list> | 通用资源调度 | #SBATCH --gres=gpu:V100:2 |
--gres-flags=<type> | GRES标志 | #SBATCH --gres-flags=enforce-binding |
--cpus-per-gpu=<ncpus> | 每GPU的CPU数 | #SBATCH --cpus-per-gpu=8 |
--gpu-bind=<type> | GPU绑定策略 | #SBATCH --gpu-bind=closest |
--gpu-freq=<frequency> | GPU频率 | #SBATCH --gpu-freq=high |
分区和队列
选项 | 描述 | 示例 |
---|
-p , --partition=<partition_names> | 分区名称 | #SBATCH --partition=gpu,compute |
共享和独占模式
选项 | 描述 | 示例 |
---|
--exclusive[=user,mcs,topo] | 独占模式 | #SBATCH --exclusive |
--oversubscribe | 允许超额订阅 | #SBATCH --oversubscribe |
-s , --overcommit | 允许任务数超过CPU数 | #SBATCH --overcommit |
输入输出控制
选项 | 描述 | 示例 |
---|
-o , --output=<filename> | 标准输出文件 | #SBATCH --output=job_%j.out |
-e , --error=<filename> | 标准错误文件 | #SBATCH --error=job_%j.err |
-i , --input=<filename> | 标准输入文件 | #SBATCH --input=/dev/null |
--open-mode={append,truncate} | 输出文件打开模式 | #SBATCH --open-mode=append |
工作目录
选项 | 描述 | 示例 |
---|
-D , --chdir=<directory> | 工作目录 | #SBATCH --chdir=/scratch/user |
邮件通知
选项 | 描述 | 示例 |
---|
--mail-type=<type> | 邮件通知类型 | #SBATCH --mail-type=END,FAIL |
--mail-user=<user> | 邮件地址 | #SBATCH --mail-user=user@domain.com |
作业依赖
选项 | 描述 | 示例 |
---|
-d , --dependency=<dependency_list> | 作业依赖关系 | #SBATCH --dependency=afterok:12345 |
--kill-on-invalid-dep={yes,no} | 依赖失效时杀死作业 | #SBATCH --kill-on-invalid-dep=yes |
依赖类型详解:
after:job_id
- 指定作业开始后afterok:job_id
- 指定作业成功完成后afternotok:job_id
- 指定作业失败后afterany:job_id
- 指定作业结束后(无论成功失败)aftercorr:job_id
- 数组作业对应任务完成后afterburstbuffer:job_id
- 突发缓冲区操作完成后singleton
- 同名作业互斥
作业数组
选项 | 描述 | 示例 |
---|
-a , --array=<indexes> | 作业数组索引 | #SBATCH --array=1-100:2%10 |
数组语法:
1-10
: 索引1到101,3,5,7
: 特定索引1-10:2
: 步长为2(1,3,5,7,9)1-100%5
: 最多同时运行5个任务
任务分布
选项 | 描述 | 示例 |
---|
-m , --distribution=<type> | 任务分布方式 | #SBATCH --distribution=cyclic |
分布类型:
block
: 块分布(默认)cyclic
: 循环分布plane=<size>
: 平面分布arbitrary
: 任意分布
CPU频率控制
选项 | 描述 | 示例 |
---|
--cpu-freq=<p1[-p2][:p3]> | CPU频率设置 | #SBATCH --cpu-freq=high |
环境变量控制
选项 | 描述 | 示例 |
---|
--export=<environment_variables> | 导出环境变量 | #SBATCH --export=ALL,PATH |
--export-file=<filename> | 从文件导出环境变量 | #SBATCH --export-file=env.txt |
--get-user-env[={timeout}[L]] | 获取用户环境 | #SBATCH --get-user-env=30L |
环境变量导出选项:
ALL
: 导出所有环境变量(默认)NONE
: 仅导出SLURM_*变量NIL
: 不导出用户环境变量VAR1,VAR2
: 导出特定变量
容器支持
选项 | 描述 | 示例 |
---|
--container=<path> | OCI容器路径 | #SBATCH --container=/path/to/container |
--container-id=<id> | 容器ID | #SBATCH --container-id=mycontainer |
突发缓冲区
选项 | 描述 | 示例 |
---|
--bb=<spec> | 突发缓冲区规格 | #SBATCH --bb="create_persistent name=mybuf capacity=1TB" |
--bbf=<filename> | 突发缓冲区脚本文件 | #SBATCH --bbf=bb_script.txt |
集群联邦
选项 | 描述 | 示例 |
---|
-M , --clusters=<list> | 目标集群 | #SBATCH --clusters=cluster1,cluster2 |
--cluster-constraint=<list> | 集群约束 | #SBATCH --cluster-constraint=gpu |
重启和容错
选项 | 描述 | 示例 |
---|
--reboot | 作业完成后重启节点 | #SBATCH --reboot |
--no-requeue | 禁止重新排队 | #SBATCH --no-requeue |
--requeue | 允许重新排队 | #SBATCH --requeue |
其他高级选项
选项 | 描述 | 示例 |
---|
--delay-boot=<minutes> | 延迟节点重启 | #SBATCH --delay-boot=10 |
--power=<flags> | 电源管理 | #SBATCH --power=level=1 |
--profile=<type> | 性能分析 | #SBATCH --profile=energy |
--acctg-freq=<datatype>=<interval> | 监控频率 | #SBATCH --acctg-freq=task=30,energy=60 |
--mcs-label=<mcs> | MCS标签 | #SBATCH --mcs-label=sensitive |
--nice[=adjustment] | 优先级调整 | #SBATCH --nice=100 |
--priority=<value> | 作业优先级 | #SBATCH --priority=1000 |
--parsable | 可解析输出 | 命令行使用 |
--test-only | 仅测试不提交 | 命令行使用 |
-v , --verbose | 详细输出 | 命令行使用 |
--wait | 等待作业完成 | 命令行使用 |
--wckey=<wckey> | 工作负载特征键 | #SBATCH --wckey=myproject |
--wrap=<args> | 包装命令 | sbatch --wrap="echo hello" |
环境变量
Slurm 在作业执行时会设置大量环境变量,可以在脚本中直接使用:
作业基本信息
变量名 | 描述 |
---|
SLURM_JOB_ID | 作业ID |
SLURM_JOB_NAME | 作业名称 |
SLURM_SUBMIT_DIR | 提交目录 |
SLURM_SUBMIT_HOST | 提交主机 |
SLURM_CLUSTER_NAME | 集群名称 |
资源分配信息
变量名 | 描述 |
---|
SLURM_NNODES | 分配的节点数 |
SLURM_NPROCS | 进程总数 |
SLURM_NTASKS | 任务总数 |
SLURM_CPUS_PER_TASK | 每任务CPU数 |
SLURM_CPUS_ON_NODE | 当前节点CPU数 |
SLURM_MEM_PER_CPU | 每CPU内存 |
SLURM_MEM_PER_NODE | 每节点内存 |
节点信息
变量名 | 描述 |
---|
SLURM_NODELIST | 分配的节点列表 |
SLURM_NODEID | 当前节点ID |
SLURM_LOCALID | 节点内本地任务ID |
SLURM_PROCID | 全局进程ID |
SLURM_TOPOLOGY_ADDR | 拓扑地址 |
作业数组变量
变量名 | 描述 |
---|
SLURM_ARRAY_JOB_ID | 数组主作业ID |
SLURM_ARRAY_TASK_ID | 当前数组任务ID |
SLURM_ARRAY_TASK_COUNT | 数组任务总数 |
SLURM_ARRAY_TASK_MAX | 最大任务ID |
SLURM_ARRAY_TASK_MIN | 最小任务ID |
GPU 相关变量
变量名 | 描述 |
---|
SLURM_GPUS | 分配的GPU数量 |
SLURM_GPUS_ON_NODE | 当前节点GPU数 |
SLURM_GPU_BIND | GPU绑定信息 |
时间相关
变量名 | 描述 |
---|
SLURM_JOB_START_TIME | 作业开始时间 |
SLURM_JOB_END_TIME | 作业结束时间 |
SLURM_TIMELIMIT | 时间限制(分钟) |
参数传递
基本参数传递
向 sbatch
脚本传递参数与普通 shell 脚本相同:
sbatch myscript.sh arg1 arg2 arg3
echo "参数1: $1"
echo "参数2: $2"
echo "参数3: $3"
echo "所有参数: $@"
echo "参数个数: $#"
高级参数处理示例
#!/bin/bash
INPUT_FILE=${1:-"default_input.txt"}
OUTPUT_DIR=${2:-"./output"}
NUM_THREADS=${3:-${SLURM_CPUS_PER_TASK}}echo "=== 作业参数 ==="
echo "输入文件: ${INPUT_FILE}"
echo "输出目录: ${OUTPUT_DIR}"
echo "线程数: ${NUM_THREADS}"
echo "作业ID: ${SLURM_JOB_ID}"
echo "节点列表: ${SLURM_NODELIST}"
mkdir -p ${OUTPUT_DIR}
export OMP_NUM_THREADS=${NUM_THREADS}
srun your_program --input ${INPUT_FILE} --output ${OUTPUT_DIR}/result_${SLURM_JOB_ID}.txt
作业数组参数传递
#!/bin/bash
INPUT_FILES=(file1.txt file2.txt file3.txt file4.txt file5.txt file6.txt file7.txt file8.txt file9.txt file10.txt)
INPUT_FILE=${INPUT_FILES[$((SLURM_ARRAY_TASK_ID-1))]}echo "处理任务 ${SLURM_ARRAY_TASK_ID}: ${INPUT_FILE}"
srun process_file ${INPUT_FILE}
实用示例
1. 指定特定节点运行作业
#!/bin/bash
echo "运行在节点: ${SLURM_NODELIST}"
srun hostname
2. 排除某些节点
#!/bin/bash
echo "可用节点: ${SLURM_NODELIST}"
srun hostname
3. GPU 作业示例
#!/bin/bash
echo "GPU信息: ${SLURM_GPUS}"
echo "节点GPU数: ${SLURM_GPUS_ON_NODE}"
srun my_cuda_program
4. 多节点MPI作业
#!/bin/bash
echo "总任务数: ${SLURM_NTASKS}"
echo "节点列表: ${SLURM_NODELIST}"
module load mpi/openmpi
srun my_mpi_program
5. 混合OpenMP+MPI作业
#!/bin/bash
export OMP_NUM_THREADS=${SLURM_CPUS_PER_TASK}echo "MPI进程数: ${SLURM_NTASKS}"
echo "OpenMP线程数: ${OMP_NUM_THREADS}"srun my_hybrid_program
6. 作业依赖链
JOB1=$(sbatch --parsable preprocessing.sh)
JOB2=$(sbatch --parsable --dependency=afterok:${JOB1} main_analysis.sh)
sbatch --dependency=afterany:${JOB2} cleanup.sh
7. 交互式作业分配
salloc --nodes=1 --ntasks=4 --time=02:00:00 --partition=debug
srun my_interactive_program
8. 批处理脚本模板
#!/bin/bash
mkdir -p logs
echo "=== 作业信息 ==="
echo "作业ID: ${SLURM_JOB_ID}"
echo "作业名: ${SLURM_JOB_NAME}"
echo "节点: ${SLURM_NODELIST}"
echo "开始时间: $(date)"
module load gcc/9.3.0
module load python/3.8.5
export OMP_NUM_THREADS=${SLURM_CPUS_PER_TASK}
srun python my_analysis.py --input data.csv --output results/echo "结束时间: $(date)"
最佳实践建议
- 总是指定时间限制:避免作业无限期运行
- 合理估算资源:避免过度申请资源
- 使用作业数组:处理大量相似任务
- 设置邮件通知:及时了解作业状态
- 检查依赖关系:确保作业按正确顺序执行
- 使用约束条件:确保在合适的硬件上运行
- 监控资源使用:优化资源配置
通过本指南,您应该能够充分利用 sbatch
的所有功能,高效地管理和提交 Slurm 作业。记住查阅 man sbatch
或官方文档获取最新信息。