PBS 作业 - 串行作业与并行作业,哪一个更适合我的场景

PBS 作业 - 串行作业与并行作业,哪一个更适合我的场景

我可以访问使用“torque”(我认为)的集群,我们使用 PBS 脚本提交作业。我需要运行 200 多个用 Java 开发的应用程序实例。该应用程序充当形成 P2P 网络的对等体,这意味着这些实例通过套接字相互通信。

我可以在集群中单个节点上运行 100 个实例来进行测试,但是在单个节点上运行 200 个实例时它不起作用,而且我无法请求更多资源(内存、核心等)

我的问题是:我应该按照我的方式做吗?使用串行脚本,我逐个启动所有实例,将它们发送到后台,然后等待它们?

是否可以通过并行脚本来实现这一点?在并行脚本中,我可以请求 2 个节点并在每个节点中实例化 100 个应用程序实例?在这种情况下,我还有其他一些问题:我该怎么做?是否有任何保证两个作业同时运行?所有 200 个实例必须同时运行。

  • 为了形成 P2P 网络,在串行作业中必须知道至少一个对等 IP 地址,我可以在脚本中获取节点 IP 地址并将其作为参数传递给应用程序,但是在具有 2 个节点的并行作业中,我该如何做到这一点?

这是我目前正在使用的脚本的一部分...

#PBS -l nodes=1:ppn=4
#PBS -l pmem=6GB
#PBS -l walltime=00:20:00
IP=`/sbin/ifconfig eth0 | grep 'inet ' | awk '{print $2}' | sed 's/addr://'`
PORT_PEER=3000
java -jar $JAR $JAR_PARAMS -ip=$IP -port=$PORT_PEER & # first peer, others connect to this one..
  for i in {1..99}
  do
   PORT_PEER=`expr $PORT_PEER + 2`;
   java -jar $JAR $JAR_PARAMS -ip=$IP -port=$PORT_PEER -bootstrap=$IP:3000 &
   sleep 1s
  done
 wait # wait here until all instances terminates

答案1

如果你将脚本更改为类似以下内容:

#PBS -l nodes=2:ppn=4

您将获得 2 个节点,每个节点至少有 4 个可用核心。您可能已经知道这一点。

您的 TORQUE 管理员可能还启用了pbsdsh。使用适当的参数,您可以使用它在作业保留的每个节点上运行命令。如果没有pbsdsh,如果他们至少启用了rsh一个队列中的系统之间的访问,您可以解析环境变量给出的文件内容$PBS_NODEFILE,并rsh解析每个非主主机的文件,在每个节点上运行 shell 脚本。

因此,未经测试,但类似于:

# main-script.sh (runs on primary node, spawns off java processes on all
# nodes in job)
#PBS -l nodes=2:ppn=4
MASTER_IP=`/sbin/ifconfig eth0 | grep 'inet ' | awk '{print $2}' \
    | sed 's/addr://'`
PORT_PEER=3000
# first peer, others connect to this one..
java -jar ${JAR} ${JAR_PARAMS} -ip=${MASTER_IP} -port=${PORT_PEER} &
# run 2 copies of smaller-script.sh on unique hostnames in this job
pbsdsh -u -c 2 /path/to/smaller-script.sh ${MASTER_IP}

# smaller-script.sh (runs on each node in job)
MASTER_IP=$1
PORT_PEER=3000
IP=`/sbin/ifconfig eth0 | grep 'inet ' | awk '{print $2}' | sed 's/addr://'`
# other peers, connecting back to first peer from other script
for i in {1..99}
do
    PORT_PEER=`expr $PORT_PEER + 2`;
    java -jar ${JAR} ${JAR_PARAMS} -ip=${IP} -port=${PORT_PEER} \
        -bootstrap=${MASTER_IP}:3000 &
    sleep 1s
done
wait # wait here until all instances terminates

应该可以帮助你开始。

相关内容