好,这里给你整理一份 Slurm 详细用法指南,从基础到进阶都涵盖,结合你在 HPC 上跑 NBody6++ 的场景。
1️⃣ Slurm 简介
Slurm = Simple Linux Utility for Resource Management
- 用于集群作业调度和资源管理
- 管理 CPU、GPU/DCU、内存、节点、队列(Partition)
- 用户通过 作业脚本 或 命令行 提交计算任务
2️⃣ 基本概念
| 名称 | 含义 |
|---|---|
| Partition | 集群中的队列或资源池,比如 kshdexclu10 |
| Node | 计算节点,如 j16r2n00 |
| CPU Core | 节点的处理核心 |
| Gres | 可选资源,GPU / DCU / MIC |
| Job | 用户提交的计算任务 |
| JobID | Slurm 给作业分配的唯一编号 |
| srun | 启动并行作业的命令 |
| sbatch | 提交批处理作业脚本 |
| scancel | 取消作业 |
3️⃣ 常用命令
查询状态
bash
sinfo # 查看集群分区状态
sinfo -N # 查看各节点状态
squeue # 查看你提交的作业队列
squeue -u $USER # 查看自己的作业
scontrol show node <nodename> # 查看节点详情
提交作业
- 批处理提交(脚本方式):
bash
sbatch nbody.sbatch
- 交互式运行(适合调试):
bash
srun -p kshdexclu10 -N 1 --gres=dcu:1 --pty bash
-p指定 Partition-N分配节点数--gres=dcu:1分配 1 个 DCU--pty bash打开交互 shell
取消作业
bash
scancel <JobID>
4️⃣ 作业脚本示例
nbody.sbatch 示例:
bash
#!/bin/bash
#SBATCH --job-name=nbody_test
#SBATCH --output=nbody_%j.out # %j -> JobID
#SBATCH --error=nbody_%j.err
#SBATCH --partition=kshdexclu10
#SBATCH --nodes=1
#SBATCH --ntasks=4 # MPI 进程数
#SBATCH --cpus-per-task=8
#SBATCH --gres=dcu:1
#SBATCH --time=02:00:00 # hh:mm:ss
#SBATCH --mem=120G
module purge
module load compiler/gcc/11.3.0
module load mpi/openmpi/4.1.2
module load compiler/dtk/23.04
export OMP_NUM_THREADS=8
ulimit -s unlimited
export OMP_STACKSIZE=80G
echo "Running NBody6++ with $SLURM_NTASKS MPI tasks and $OMP_NUM_THREADS threads"
mpirun -np $SLURM_NTASKS ../install/bin/nbody6++ < N10k_noDat10.inp
5️⃣ srun 和 mpirun 的区别
| 命令 | 用途 |
|---|---|
srun |
Slurm 原生并行运行命令,会自动分配资源 |
mpirun / mpiexec |
启动 MPI 程序,需要手动匹配 Slurm 分配的资源(通常和 OpenMPI 配合) |
推荐:
bash
srun -n 4 ../install/bin/nbody6++ < input.inp
- Slurm 会自动绑定 CPU / GPU
- 不用手动
mpirun,减少出错概率
6️⃣ 交互式调试
- 快速测试程序或修改参数,不用写 sbatch 文件:
bash
srun -p kshdexclu10 -N 1 --ntasks=1 --gres=dcu:1 --pty bash
- 进入节点后:
bash
../install/bin/nbody6++ < N10k_noDat10.inp
7️⃣ 高级用法
同时请求多节点多 GPU
bash
sbatch -p kshdexclu10 -N 2 --ntasks-per-node=4 --gres=dcu:2 nbody.sbatch
- 2 个节点,每个节点 4 个 MPI 进程,每个节点分配 2 张 DCU
- Slurm 会帮你调度,不会占用其它空闲节点
设置作业依赖
bash
sbatch --dependency=afterok:<JobID> next_job.sbatch
- 下一步作业会在
<JobID>成功完成后才启动
查看详细作业信息
bash
scontrol show job <JobID>
8️⃣ Tips
- 作业输出文件 最好包含
%j,避免覆盖 - **
--ntasks与--cpus-per-task**区分 MPI 进程数和每个进程的线程数 --gres对 GPU / DCU 必须指定,否则程序找不到 GPU- 调试小作业在交互节点测试,正式大作业用 sbatch 提交
如果你愿意,我可以帮你画一张 Slurm 作业提交流程图 ,从提交 -> 分配节点 -> 运行 -> 输出 -> 结束,让整个流程一眼就看明白,非常适合新手 HPC 使用。
