单节点指定任务数时Slurm无法运行MPI作业
问题分析与解决方案
问题描述
我在HPC集群上运行单进程需大内存的计算任务,使用一台配备512GB内存、28核的节点。由于单个进程所需内存超过512/28≈18.29GB,我特意不饱和使用节点:运行2个或12个进程时无异常,但运行6个或7个进程时出现以下错误:
srun: error: node058: tasks 3-5: Exited with exit code 255
我的Slurm脚本相关部分如下:
#!/bin/bash -l #SBATCH --nodes=1 #SBATCH --tasks-per-node=6 #SBATCH --hint=nomultithread #SBATCH --partition=mem512 #SBATCH --time=1008:00:00 #SBATCH --mail-type=NONE #SBATCH --job-name=$NAME #SBATCH --exclusive #SBATCH --export=NONE export SLURM_EXPORT_ENV=ALL export I_MPI_DEBUG=5 export I_MPI_PMI_LIBRARY=/usr/lib64/libpmi.so.0 #set period as decimal point export LC_NUMERIC=C ulimit -s unlimited ulimit -l hard export TMPDIR=/scratch/$SLURM_JOB_USER/$SLURM_JOBID srun --cpu-bind=cores some_program < input 1> $SLURM_SUBMIT_DIR/output 2>error
可能原因及解决方法
1. 内存分配不均
虽然用了--exclusive独占节点,但Slurm默认可能按核心比例分配内存。6/7个进程的数量刚好触发节点内存分片的边界,导致部分进程拿到的内存低于单进程需求,触发退出。
解决方法:
- 显式指定单任务内存配额,假设单进程需要24GB,添加SBATCH参数:
#SBATCH --mem-per-cpu=24G - 或者结合单任务单核心配置,直接锁定节点全部内存:
#SBATCH --cpus-per-task=1 #SBATCH --mem=512G
2. NUMA节点内存局部性问题
28核节点通常分为2个NUMA节点(各14核),运行2/12个进程时能均匀分布在NUMA节点,内存分配充足;但6/7个进程可能打破这种平衡,导致部分进程跨NUMA节点绑定,触发内存分配失败。
解决方法:
- 修改
srun的CPU绑定策略为NUMA节点级:srun --cpu-bind=numa some_program < input 1> $SLURM_SUBMIT_DIR/output 2>error - 添加SBATCH参数强制任务按NUMA节点分片分配:
#SBATCH --distribution=block:block
3. 临时目录空间耗尽
6/7个进程同时写入/scratch下的临时目录,可能导致该分区空间不足,触发进程异常退出(exit code255常与资源不足相关)。
解决方法:
- 检查
/scratch分区可用空间,确保容量足够; - 若程序允许,将临时目录切换到内存文件系统(注意不要超过节点内存):
export TMPDIR=/dev/shm/$SLURM_JOBID
4. MPI通信或资源获取失败
Intel MPI的I_MPI_DEBUG=5已开启调试,建议查看error文件中的MPI日志,确认是否是进程间通信失败或资源获取超时导致的退出。
额外排查步骤:
- 给
srun添加--verbose参数,获取更详细的Slurm调度日志:srun --verbose --cpu-bind=cores some_program < input 1> $SLURM_SUBMIT_DIR/output 2>error - 用
numactl --hardware查看节点NUMA拓扑,确认内存分布后调整任务分配策略。
内容的提问来源于stack exchange,提问作者Severus Snape
相关产品推荐
相关产品推荐

