Slurm 基本命令指南
本文档提供了 Slurm 工作负载管理器的常用命令和用法,帮助用户快速上手 Slurm 系统。
作业提交命令
srun - 交互式运行作业
srun
命令用于提交交互式作业,作业会立即执行,并在终端显示输出。
基本用法:
bash
srun [选项] <命令>
常用选项:
bash
-N, --nodes=<数量> # 指定节点数量
-n, --ntasks=<数量> # 指定任务数量
-c, --cpus-per-task=<数量> # 指定每个任务的 CPU 数量
--mem=<大小> # 指定内存大小(如:1G, 100M)
-p, --partition=<分区名> # 指定要使用的分区
-t, --time=<时间> # 指定最大运行时间(格式:分钟 或 天-小时:分钟:秒)
--gres=<资源> # 指定通用资源(如:gpu:1)
示例:
bash
# 在一个节点上运行 hostname 命令
srun hostname
# 在 2 个节点上运行 hostname 命令
srun -N2 hostname
# 使用 4 个 CPU 核心运行程序
srun -c4 ./my_program
# 分配 2GB 内存运行程序
srun --mem=2G ./my_program
# 限制运行时间为 10 分钟
srun -t 10 ./my_program
# 在 GPU 分区使用 1 个 GPU 运行程序
srun -p gpu --gres=gpu:1 ./my_gpu_program
sbatch - 批处理提交作业
sbatch
命令用于提交批处理作业脚本,作业会被放入队列中等待调度执行。
基本用法:
bash
sbatch [选项] <脚本文件>
批处理脚本示例 (job.sh):
bash
#!/bin/bash
#SBATCH --job-name=test_job # 作业名称
#SBATCH --nodes=1 # 节点数量
#SBATCH --ntasks=1 # 任务数量
#SBATCH --cpus-per-task=1 # 每个任务的 CPU 数量
#SBATCH --mem=1G # 内存大小
#SBATCH --time=01:00:00 # 最大运行时间(1小时)
#SBATCH --output=%j.out # 标准输出文件(%j 表示作业ID)
#SBATCH --error=%j.err # 标准错误文件
# 作业命令
echo "Running job on $(hostname)"
sleep 60
echo "Job completed"
提交作业:
bash
sbatch job.sh
salloc - 分配资源
salloc
命令用于请求资源分配,通常用于交互式会话。
基本用法:
bash
salloc [选项] [命令]
示例:
bash
# 请求 2 个节点的资源,并启动交互式 shell
salloc -N2
# 请求 4 个 CPU 核心和 2GB 内存,并运行命令
salloc -c4 --mem=2G ./my_program
作业管理命令
squeue - 查看作业队列
squeue
命令用于查看当前作业队列状态。
基本用法:
bash
squeue [选项]
常用选项:
bash
-u, --user=<用户名> # 只显示指定用户的作业
-t, --states=<状态> # 只显示指定状态的作业(如:RUNNING,PENDING)
-p, --partition=<分区名> # 只显示指定分区的作业
--sort=<字段> # 按指定字段排序
-l, --long # 显示详细信息
示例:
bash
# 查看所有作业
squeue
# 查看自己的作业
squeue -u $USER
# 查看正在运行的作业
squeue -t RUNNING
# 按优先级排序显示作业
squeue --sort=p,i
scancel - 取消作业
scancel
命令用于取消已提交的作业。
基本用法:
bash
scancel [选项] <作业ID>
常用选项:
bash
-u, --user=<用户名> # 取消指定用户的所有作业
-n, --name=<作业名> # 取消指定名称的所有作业
-t, --state=<状态> # 取消指定状态的所有作业
-p, --partition=<分区名> # 取消指定分区的所有作业
示例:
bash
# 取消作业 ID 为 12345 的作业
scancel 12345
# 取消自己的所有作业
scancel -u $USER
# 取消所有名为 "test_job" 的作业
scancel -n test_job
# 取消所有等待中的作业
scancel -t PENDING
scontrol - 查看和修改作业
scontrol
命令是 Slurm 的管理工具,可以查看和修改作业信息。
基本用法:
bash
scontrol [操作] [选项]
常用操作:
bash
show job <作业ID> # 显示作业详细信息
show node <节点名> # 显示节点详细信息
show partition # 显示分区信息
update job <作业ID> <参数> # 更新作业参数
hold job <作业ID> # 暂停作业
release job <作业ID> # 释放暂停的作业
示例:
bash
# 查看作业 ID 为 12345 的详细信息
scontrol show job 12345
# 查看节点 compute1 的详细信息
scontrol show node compute1
# 修改作业的时间限制
scontrol update job 12345 TimeLimit=2:00:00
# 暂停作业
scontrol hold job 12345
# 释放暂停的作业
scontrol release job 12345
集群状态命令
sinfo - 查看集群状态
sinfo
命令用于查看集群和分区状态。
基本用法:
bash
sinfo [选项]
常用选项:
bash
-N, --Node # 按节点格式显示
-l, --long # 显示详细信息
-p, --partition=<分区名> # 只显示指定分区
-t, --states=<状态> # 只显示指定状态的节点
-o, --format=<格式> # 自定义输出格式
示例:
bash
# 查看集群状态
sinfo
# 显示详细的节点信息
sinfo -N -l
# 只显示空闲节点
sinfo -t idle
# 自定义输出格式
sinfo -o "%P %N %C %m" # 显示分区、节点、CPU 和内存信息
sacct - 查看作业历史
sacct
命令用于查看已完成作业的历史记录和统计信息。
基本用法:
bash
sacct [选项]
常用选项:
bash
-j, --jobs=<作业ID> # 只显示指定作业
-u, --user=<用户名> # 只显示指定用户的作业
-S, --starttime=<时间> # 指定开始时间
-E, --endtime=<时间> # 指定结束时间
-o, --format=<格式> # 自定义输出格式
示例:
bash
# 查看今天的作业历史
sacct -S today
# 查看过去一周的作业历史
sacct -S $(date -d "1 week ago" +%Y-%m-%d)
# 查看指定作业的详细信息
sacct -j 12345 --format=JobID,JobName,MaxRSS,Elapsed
# 查看自己的作业历史
sacct -u $USER
资源管理命令
sshare - 查看公平共享信息
sshare
命令用于查看公平共享调度信息,包括用户和账户的资源使用情况。
基本用法:
bash
sshare [选项]
示例:
bash
# 查看所有用户的共享信息
sshare
# 查看自己的共享信息
sshare -u $USER
sprio - 查看作业优先级
sprio
命令用于查看作业的优先级信息。
基本用法:
bash
sprio [选项]
示例:
bash
# 查看所有作业的优先级
sprio
# 查看自己作业的优先级
sprio -u $USER
高级用法
作业数组
作业数组允许用户提交多个相似的作业,每个作业处理不同的数据。
批处理脚本示例 (array_job.sh):
bash
#!/bin/bash
#SBATCH --job-name=array_job
#SBATCH --array=1-10 # 创建 10 个作业,索引从 1 到 10
#SBATCH --output=array_%A_%a.out # %A 是作业 ID,%a 是数组索引
echo "Running task $SLURM_ARRAY_TASK_ID"
# 使用数组索引处理不同的输入文件
./my_program input_$SLURM_ARRAY_TASK_ID.dat
提交作业数组:
bash
sbatch array_job.sh
作业依赖
作业依赖允许用户指定作业之间的依赖关系,例如一个作业必须在另一个作业完成后才能开始。
示例:
bash
# 提交第一个作业
job1=$(sbatch --parsable job1.sh)
# 提交依赖于第一个作业的第二个作业
sbatch --dependency=afterok:$job1 job2.sh
依赖类型:
after
: 在指定作业开始后开始afterany
: 在指定作业结束后开始(无论成功与否)afterok
: 在指定作业成功完成后开始afternotok
: 在指定作业失败后开始
资源预留
管理员可以使用 scontrol
命令创建资源预留,为特定用户或组保留资源。
示例:
bash
# 创建资源预留
scontrol create reservation starttime=now duration=120 user=username nodes=compute[1-2] flags=maint,ignore_jobs
# 使用预留资源提交作业
sbatch --reservation=<预留名> job.sh
环境变量
Slurm 会在作业运行时设置多个环境变量,可以在脚本中使用:
bash
SLURM_JOB_ID # 作业 ID
SLURM_JOB_NAME # 作业名称
SLURM_SUBMIT_DIR # 作业提交目录
SLURM_JOB_NODELIST # 分配的节点列表
SLURM_NTASKS # 任务总数
SLURM_CPUS_PER_TASK # 每个任务的 CPU 数量
SLURM_ARRAY_TASK_ID # 作业数组索引
示例脚本:
bash
#!/bin/bash
#SBATCH --job-name=env_test
#SBATCH --nodes=2
#SBATCH --ntasks=4
echo "Job ID: $SLURM_JOB_ID"
echo "Job Name: $SLURM_JOB_NAME"
echo "Submit Directory: $SLURM_SUBMIT_DIR"
echo "Node List: $SLURM_JOB_NODELIST"
echo "Number of Tasks: $SLURM_NTASKS"
常见问题解决
作业一直处于 PENDING 状态
可能的原因:
- 资源不足(节点、CPU、内存等)
- 达到用户或队列限制
- 节点处于维护状态
- 作业依赖未满足
解决方法:
bash
# 查看作业详细信息,包括等待原因
scontrol show job <作业ID>
# 修改作业资源需求
scontrol update job <作业ID> NumNodes=1 NumCPUs=1
作业被取消或失败
可能的原因:
- 超出时间限制
- 超出内存限制
- 程序错误
解决方法:
bash
# 查看作业详细信息
sacct -j <作业ID> --format=JobID,JobName,State,ExitCode,Comment
# 检查作业输出和错误文件
cat slurm-<作业ID>.out
cat slurm-<作业ID>.err