我有以下名为gzip2zipslurm.sh
的SLURM作业脚本:
#!/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"
我通过sbatch gzip2zipslurm.sh
将其提交给SLURM。
完成后,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条,sbatch作业有1条隐式),但是只有一个Java进程。我还可以在正在处理的文件上看到它,只写了一个。
如何管理所有4个任务实际上并行执行?
感谢任何提示!
答案 0 :(得分:0)
问题可能出在内存预留上。在提交脚本中,设置--mem=70GB
,即作业的全局内存使用情况。
在提交脚本中使用srun
时,它将从sbatch
继承参数,包括--mem=70GB
。因此,您实际上暗中运行了以下代码。
srun --mem 70G -n1 java -Xmx10g -jar ...
尝试通过以下方式明确声明内存为70GB / 4:
srun --mem 17G -n1 java -Xmx10g -jar ...
此外,根据文档,您还应该在这种情况下将--exclusive
与srun
一起使用。
srun --exclusive --mem 17G -n1 java -Xmx10g -jar ...
启动多个工作步骤时也可以使用此选项 在现有资源分配中,您希望将其分开 专用于每个工作步骤的处理器。如果有足够的处理器 不能启动工作步骤,它将被推迟。这个 可以认为是提供了一种资源管理机制 分配中的工作。