我正在尝试模拟客户端-服务器交互。为此,我想使用同一群集中的两台不同的服务器。传统上,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.bash
和launch_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}}。
我们如何精确地从分区b
和a
获得对一组节点的请求?
答案 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
如果jid2
在jid1
完成之前无法获得资源或too late
不能获得资源,这将失败