У меня есть доступ к кластеру, который использует «крутящий момент» (я думаю), и мы используем сценарии PBS для отправки заданий. Мне нужно запустить более 200 экземпляров приложения, которое я разработал на java. Приложение действует как одноранговый узел, формирующий сеть P2P, что означает, что эти экземпляры взаимодействуют друг с другом через сокеты.
Я смог провести свои тесты со 100 экземплярами, запущенными на одном узле в кластере, но при запуске 200 экземпляров на одном узле это не работает, и я не могу запросить дополнительные ресурсы (память, ядра и т. )
У меня вопрос: должен ли я делать это так, как я? С последовательным скриптом, в котором я запускаю все свои экземпляры один за другим, отправляя их в фоновый режим, а затем жду их?
Можно ли это сделать с помощью параллельного скрипта, в котором я мог бы запросить 2 узла и создать 100 экземпляров моего приложения в каждом узле? В этом случае у меня есть другие вопросы: как мне это сделать? и есть ли гарантия, что оба задания будут выполняться одновременно? Все 200 экземпляров должны работать одновременно.
Это часть сценария, который я сейчас использую ...
#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
Если вы измените сценарий на что-то вроде:
#PBS -l nodes=2:ppn=4
вы получите 2 узла, каждый с как минимум 4 доступными ядрами. Возможно, вы это уже знаете.
Ваш администратор МОМЕНТА также мог включить pbsdsh
. С правильными аргументами вы можете использовать это для запуска команд на каждом узле, зарезервированном вашим заданием. Без pbsdsh
, если они хотя бы включили rsh
доступ между системами в одной очереди, вы можете анализировать содержимое файла, заданного переменной среды $PBS_NODEFILE
и rsh
для каждого из них, не являющегося основным хостом, выполняя сценарий оболочки на каждом.
Итак, непроверенный, но что-то вроде:
# 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
должно вас начать.