为每个子作业分配来自不同分区的节点

时间:2019-05-02 08:03:35

标签: slurm

我正在尝试模拟客户端-服务器交互。为此,我想使用同一群集中的两台不同的服务器。传统上,Slurm允许我们通过请求一组节点来实现这一点

    #!/bin/bash
    #SBATCH --job-name="test-script"
    #SBATCH -D .
    #SBATCH --output=./testlog/test-%j.out
    #SBATCH --error=./testlog/test-%j.err
    #SBATCH --nodes=3
    #SBATCH --exclusive
    #SBATCH --time=00:02:00
    #SBATCH --partition=a,b
LOG_FILES=${PWD}
    srun -lN1 -r 0 --output=${LOG_FILES}/'Server-%j.out' --error=${LOG_FILES}/'Server-%j.err' --unbuffered stdbuf --output=0 --error=0 ./launch_server.bash  &
    sleep 1
    srun -lN1 -r 1 --output=${LOG_FILES}/'Client-%j.out' --error=${LOG_FILES}/'Client-%j.err' --unbuffered stdbuf --output=0 --error=0 ./launch_client.bash &
    sleep 1
    srun -lN1 -r 2 --output=${LOG_FILES}/'Client1-%j.out' --error=${LOG_FILES}/'Client1-%j.err' --unbuffered stdbuf --output=0 --error=0 ./launch_client.bash &

这基本上使我们能够在分区a和b的组合上获得两个3个不同的节点。

launch_client.bashlaunch_server.bash是执行此ifconfig | grep 'inet'

的相当简单的脚本

我现在要解决的问题是弄清楚如何从分区“ a”获取资源以用于“服务器”,如何从分区“ b”获取资源以用于“客户端”。

这是我的第一次尝试

    #!/bin/bash
    #SBATCH --job-name="test-script"
    #SBATCH -D .
    #SBATCH --output=./testlog/test-%j.out
    #SBATCH --error=./testlog/test-%j.err
    #SBATCH --nodes=3
    #SBATCH --exclusive
    #SBATCH --time=00:02:00
    #SBATCH --partition=a,b
LOG_FILES=${PWD}
    srun --partition=a -lN1 -r 0 --output=${LOG_FILES}/'Server-%j.out' --error=${LOG_FILES}/'Server-%j.err' --unbuffered stdbuf --output=0 --error=0 ./launch_server.bash  &
    sleep 1
    srun --partition=b -lN1 -r 1 --output=${LOG_FILES}/'Client-%j.out' --error=${LOG_FILES}/'Client-%j.err' --unbuffered stdbuf --output=0 --error=0 ./launch_client.bash &
    sleep 1
    srun --partition=b -lN1 -r 2 --output=${LOG_FILES}/'Client1-%j.out' --error=${LOG_FILES}/'Client1-%j.err' --unbuffered stdbuf --output=0 --error=0 ./launch_client.bash &

不幸的是,这只能从a/b / {生成,而从b任意获取资源,并且也在a / a生成服务器/客户端。 {1}}。

我们如何精确地从分区ba获得对一组节点的请求?

1 个答案:

答案 0 :(得分:0)

这不是最优雅的方法,并且在至少一个 main 方案中会失败。

这是启动脚本

#!/bin/bash
jid1=$(sbatch testscript2.bash)
jid1=$(echo $jid1 | awk '{print $4}')
jid2=$(sbatch --dependency=after:${jid1} testscript.bash)

这是test_script2.bash的脚本

#!/bin/bash
#SBATCH --job-name="test-script2"
#SBATCH -D .
#SBATCH --output=./testlog/test1-%j.out
#SBATCH --error=./testlog/test1-%j.err
#SBATCH --time=00:02:00
#SBATCH --nodes=1
#SBATCH --partition=a

LOG_FILES=${PWD}

srun -lN1 -r 0 --output=${LOG_FILES}/'Server-%j.out' --error=${LOG_FILES}/'Server-%j.err' --unbuffered stdbuf --output=0 --error=0 ./launch_client.bash  & wait

这是testscript.bash的脚本

#!/bin/bash
#SBATCH --job-name="test-script"
#SBATCH -D .
#SBATCH --output=./testlog/test-%j.out
#SBATCH --error=./testlog/test-%j.err
#SBATCH --time=00:02:00
#SBATCH --nodes=2
#SBATCH --partition=b

LOG_FILES=${PWD}

srun --partition=b -lN1 -r 0 --output=${LOG_FILES}/'Client-%j.out' --error=${LOG_FILES}/'Client-%j.err' --unbuffered stdbuf --output=0 --error=0 ./launch_client.bash &
sleep 1
srun --partition=b -lN1 -r 1 --output=${LOG_FILES}/'Client1-%j.out' --error=${LOG_FILES}/'Client1-%j.err' --unbuffered stdbuf --output=0 --error=0 ./launch_client.bash &
sleep 1

如果jid2jid1完成之前无法获得资源或too late不能获得资源,这将失败

相关问题