1

我有以下名为 SLURM 的作业脚本gzip2zipslurm.sh

#!/bin/bash
#SBATCH --mem 70G
#SBATCH --ntasks 4
echo "Task 1"
srun -n1 java -Xmx10g -jar tar2zip-1.0.0-jar-with-dependencies.jar articles.A-B.xml.tar.gz  &
echo "Task 2"
srun -n1 java -Xmx10g -jar tar2zip-1.0.0-jar-with-dependencies.jar articles.C-H.xml.tar.gz  &
echo "Task 3"
srun -n1 java -Xmx10g -jar tar2zip-1.0.0-jar-with-dependencies.jar articles.I-N.xml.tar.gz  &
echo "Task 4"
srun -n1 java -Xmx10g -jar tar2zip-1.0.0-jar-with-dependencies.jar articles.O-Z.xml.tar.gz  &
echo "Waiting for job steps to end"
wait
echo "Script complete"

我将它提交给 SLURM 由sbatch gzip2zipslurm.sh. 当我这样做时,SLURM 日志文件的输出是

Task 1
Task 2
Task 3
Task 4
Waiting for job steps to end

tar2zip程序读取给定文件并将其tar.gz重新打包为ZIP文件。

问题:只有一个 CPU(空闲节点上可用的 16 个 CPU)在做任何工作。我top可以看到所有 5 个srun命令都已启动(我猜 4 个用于我的任务,1 个隐含用于 sbatch 作业)但只有一个 Java 进程。我也可以在正在处理的文件上看到它,只写了一个。

我如何管理所有 4 个任务实际上是并行执行的?

感谢您的任何提示!

4

1 回答 1

1

问题可能与内存预留有关。在提交脚本中,您设置--mem=70GB,即作业的全局内存使用量。

srun提交脚本中使用时,它从 继承参数sbatch,包括--mem=70GB. 因此,您实际上隐式运行以下命令。

srun --mem 70G -n1 java -Xmx10g -jar ...

尝试使用以下命令明确将内存声明为 70GB/4:

srun --mem 17G -n1 java -Xmx10g -jar ...

此外,根据文档,您应该在这种情况下使用--exclusivewith 。srun

srun --exclusive --mem 17G -n1 java -Xmx10g -jar ...

在现有资源分配中启动多个作业步骤时,也可以使用此选项,您希望单独的处理器专用于每个作业步骤。如果没有足够的处理器来启动作业步骤,它将被推迟。这可以被认为是为分配中的作业提供资源管理机制。

于 2018-09-21T06:50:37.653 回答