通过 slurm 脚本限制堆栈大小

ulimit stack size through slurm script

在我的 bash 脚本中,我得到以下命令

 ulimit -s unlimited

然而,当我通过 sbatch job.sh 启动我的工作,然后通过 ssh 连接到其中一个计算机节点以检查堆栈大小 ulimit -a 我清楚地看到堆栈大小是:

  stack size              (kbytes, -s) 8192

这是我的完整脚本

#!/bin/bash -l
#SBATCH --job-name=test
#SBATCH --nodes=13
#SBATCH --ntasks-per-node=32
#SBATCH --mem=120GB
#SBATCH --time=999:99:00
#SBATCH --propagate=STACK

 ulimit -s unlimited
mpirun ./pres.a

ulimit 是一个 shell 内置命令。用它设置的资源限制不是系统范围的,仅适用于在同一 shell 会话及其后代中启动的进程。当您通过 SSH 进入一个节点并执行 ulimit 时,它会向您显示该特定 shell 会话中的限制,而不是应用于作业中进程的限制,即使其中一些是 运行 在同一节点上。

此外,--propagate=STACK 传播执行 sbatch 命令的 shell 会话的资源限制,而不是作业脚本中设置的限制:

PropagateResourceLimits

A list of comma separated resource limit names. The slurmd daemon uses these names to obtain the associated (soft) limit values from the users process environment on the submit node. These limits are then propagated and applied to the jobs that will run on the compute nodes.

因此,作业脚本中的 ulimit -s unlimited 仅适用于执行作业时由 SLURM 启动的 shell 进程,除非 mpirun 将限制进一步传播到它所在的进程生成时,它们将继承系统默认的堆栈大小限制。但如果你这样做:

$ ulimit -s unlimited
$ sbatch --propagate=STACK foo.sh

(或者像您一样在 foo.sh 中设置 #SBATCH --propagate=STACK),那么 SL​​URM 为该作业生成的所有进程都已经将其堆栈大小限制设置为无限制。