Slurm解除作业内存限制方法
问题
有一个串行作业通过Slurm提交到计算节点计算,程序需要的内存量虽然没有超过计算节点的物理内存,但因为Slurm对作业分配的单个CPU核的内存进行了限制,导致程序进程因out-of-memory
(OOM)被Slurm强制杀掉。
我们通过以下程序来复现问题。该程序申请了一个1024*1024*1024*8
字节大小(8GB)的双精度buffer数组,加上其它一些量的内存需求,该程序实际上需要>8GB
的内存空间。
program main
implicit none
integer,parameter :: NX = 1024
real*8,allocatable,dimension(:,:,:) :: buffer
integer :: i,j,k
allocate(buffer(NX,NX,NX))
buffer = 1.0d0
buffer = buffer + sqrt(buffer+3.0)
print*, buffer(1,1,1)
deallocate(buffer)
end
运行对应的Slurm作业脚本如下
#!/usr/bin/bash
#SBATCH -J test
#SBATCH --comment test
#SBATCH -p serial
#SBATCH -o ./log.out
#SBATCH -e ./log.err
ulimit -s unlimited
./a.out
sbatch job.sbatch
提交作业运行,会报以下错误信息:
/opt/gridview/slurm/spool_slurmd/job211575/slurm_script: line 13: 1529967 Killed ./a.out
slurmstepd: error: Detected 1 oom-kill event(s) in StepId=211575.batch cgroup. Some of your processes may have been killed by the cgroup out-of-memory handler.
从报错信息可以看出是由于作业请求内存超过了Slurm资源限制(out-of-memory),因此被Slurm杀掉。
那么如何查询节点的Slurm内存资源配置信息呢?
查询Slurm内存配置方法
- 查询计算节点物理内存大小
$ sinfo -N -o "%.12n %.10P %.4c %.10m"
- 查询节点已使用内存大小及限制
$ scontrol -o show nodes|awk '{print $1, $23, $24, $35, $39}'
其中$23 $24 $35 $39
与机器操作系统架构显示名称有关系(因为架构信息是空格分隔,不同架构导致awk用空格分隔的列数不同)
输出信息示例:
NodeName=xxxxx RealMemory=513330 AllocMem=7800 Partitions=serial AllocTRES=cpu=1,mem=7800M
其中RealMemory
是节点实际内存量,AllocMem
是分配的内存量。AllocTRES
是分配的可追踪资源,1个CPU核的内存大小为7800MB。
可以看出对于串行队列作业,每个CPU核默认分配7800MB,少于以上测试程序需要的内存量,这解释了测试程序为何会因内存不够被Slurm杀掉。
解决方法
使用--mem
或者--mem-per-cpu
指定请求的内存量,区别在于前者请求每个节点(Node)的内存量,而后者请求的是每个CPU的内存量。
对于串行作业,使用--mem-per-cpu
更加合适,以下作业脚本申请了9GB的内存,程序成功运行。
#!/usr/bin/bash
#SBATCH -J test
#SBATCH --comment test
#SBATCH -p serial
#SBATCH --mem-per-cpu=9G #请求单核分配9GB内存空间
#SBATCH -o ./log.out
#SBATCH -e ./log.err
ulimit -s unlimited
./a.out
参考资料
Common Job Failures - Yale Center for Research Computing


博主真是太厉害了!!!