Цель: объединить несколько серверов в один вычислительный кластер, предоставить
пользователям простой способ запуска вычислительных задач не конфликтуя друг с
другом. Для этого необходимы несколько серверов под управлением Linux(ниже
описывается установка на RedHat), быстрый канал между серверами, ПО для
организации очереди, вычислительное ПО умеющее распараллеливать вычисление на
несколько узлов (например с помощью mpi).
Установка и настройка ПО
Torque - менеджер ресурсов, отвечает за отслеживание доступного количества
ресурсов на узлах кластера и запуск задач.
Первым шагом устанавливаем torque на управляющую ноду. Скачиваем исходники с
http://www.clusterresources.com. Установка происходит обычным для Linux способом:
tar -xzvf torque-2.x.x.tgz
cd torque-2.x.x
./configure --prefix=/usr/local
make
make install или make rpm
(во втором случае будет собран rpm пакет который затем можно установить)
Копируем скрипты запуска сервера pbs.
cp contrib/init.d/pbs_server /etc/init.d/
В файл /var/spool/torque/server_priv/nodes добавляем все узлы нашего кластера и
указываем специфичные для этих узлов параметры. Параметры для описания узлов
можно добавлять самостоятельно какие вам необходимы: архитектура узла (x86,
sparc, ...), способ подключения к сети (ethernet, infiniband, ...) и т.п. Пример:
s200 np=4 arch=x86_64
s200-01 np=2 arch=x86_32
s200-02 np=2 arch=x86_32
s200-03 np=4 arch=x86_64
np - количество процессоров на узле.
Запускаем pbs сервер /etc/init.d/pbs_server start
Создадим одну дефолтную очередь batch на сервере.
# qmrg
create queue batch
set queue batch queue_type = Execution
set queue batch resources_default.nodes = 1
set queue batch resources_default.walltime = 01:00:00
set queue batch resources_available.nodect = 999999
set queue batch enabled = True
set queue batch started = True
set server acl_hosts = s200
set server default_queue = batch
set server log_events = 511
set server mail_from = adm
set server scheduler_iteration = 600
set server node_check_rate = 150
set server tcp_timeout = 6
set server next_job_number = 21</i>
Очередей может быть несколько, задачи можно направлять в разные очереди с помощью списков доступа.
Устанавливаем torque на все вычислительные узлы кластера так же как и на
управляющий узел, единственное необходим скрипт запуска монитора pbs, а не сервера.
cp contrib/init.d/pbs_mon /etc/init.d/
Прописываем на вычислительных узлах в файл /var/spool/torque/mom_priv/config наш pbs сервер:
$pbsserver s200 # s200 - указываем управляющий узел
$logevent 255 # bitmap of which events to log</i>
Запускаем pbs_mon
/etc/init.d/pbs_mon start
Правильно будет установить и настроить все необходимое ПО на один
вычислительный узел, а затем клонировать ее на остальные узлы кластера.
Если все сделано правильно, на управляющем узле можно выполнить команду
"pbsnodes -a", вывод должен быть примерно следующий:
s200
state = free
np = 4
ntype = cluster
status = opsys=linux,uname=Linux s200 2.6.9-67.0.15.ELsmp #1 SMP Tue Apr 22 13:58:43 EDT 2008 x86_64,sessions=4793 6052
9319,nsessions=3,nusers=2,idletime=7,totmem=16343180kb,availmem=15996556kb,physmem=8150040kb,ncpus=4,
loadave=0.00,netload=13384946066,state=free,jobs=,varattr=,rectime=1240470984
s200-01
state = free
np = 2
ntype = cluster
status = opsys=linux,uname=Linux s200-01 2.6.9-67.0.15.ELsmp #1 SMP Tue Apr 22 13:58:43 EDT 2008 x86_64,sessions=?
0,nsessions=? 0,nusers=0,idletime=153089,totmem=12231176kb,availmem=12080240kb,physmem=4038036kb,ncpus=2,loadave=0.00,
netload=251768374518,state=free,jobs=,varattr=,rectime=1240470944
s200-02
state = free
np = 2
ntype = cluster
status = opsys=linux,uname=Linux s200-02 2.6.9-67.0.15.ELsmp #1 SMP Tue Apr 22 13:58:43 EDT 2008 x86_64,sessions=?
0,nsessions=? 0,nusers=0,idletime=76890,totmem=12231176kb,availmem=12037100kb,physmem=4038036kb,ncpus=2,
loadave=0.00,netload=272192353204,state=free,jobs=,varattr=,rectime=1240470956
...
Запустим какую-нибудь задачу на выполнение (для запуска залогинтесь под обычным
пользователем, не под root-ом):
$ su - testuser
$ echo "sleep 20" | qsub
22.s200
Проверим состояние:
$ qstat
Job id Name User Time Use S Queue
------------------------- ---------------- --------------- -------- - -----
22.s200 STDIN testuser 0 Q batch
Задача будет висеть в очереди но не выполниться, так как у нас не установлен и
не настроем менеджер очереди. Вообще torque содержит свой шедулер (pbs_sched),
но он имеет ограниченный функционал и настройки. Мы будем использовать более
развитый шедулер - Maui.
Пока удалим наше задание:
$ qdel 22.s200
Установка менеджера очереди Maui
Maui занимается тем, что опрашивает torque на предмет наличия свободных
ресурсов и задач в очереди которые необходимо выполнить. На основе полученных
данных и своих настроек, он принимает решение о запуске какой-либо задачи и
посылает команду серверу torque выполнить ее. Maui позволяет гибко настроить
различные стратегии заполнения кластера, приоритеты для задач по различным
критериям: количеству запрашиваемых ресурсов, принадлежности пользователя к
какой-то группе и т.д.
Скачиваем исходники с сайта http://www.clusterresources.com/ и устанавливаем на
управляющей ноде (теоретически можно установить куда угодно, но чтобы не
усложнять установим там же где и сервер torque). Настройка maui производится в
файле /usr/local/maui/maui.cfg Большую часть настроек сделает конфигуратор во
время установки. Далее для интеграции maui с torque надо указать, что мы
используем менеджер ресурсов PBS (torque): RMCFG[S200] TYPE=PBS
Получаем примерно следующий минимальный конфиг:
SERVERHOST s200
ADMIN1 root
RMCFG[S200] TYPE=PBS
AMCFG[bank] TYPE=NONE
RMPOLLINTERVAL 00:00:30
SERVERPORT 42559
SERVERMODE NORMAL
LOGFILE maui.log
LOGFILEMAXSIZE 10000000
LOGLEVEL 3
QUEUETIMEWEIGHT 1
BACKFILLPOLICY FIRSTFIT
RESERVATIONPOLICY CURRENTHIGHEST
NODEALLOCATIONPOLICY MINRESOURCE
Запускаем maui:
# maui
Еще раз запустим тестовую задачу:
$ echo "sleep 20" | qsub
23.s200
qstat должна показать, что задача встала в очередь (статус Q), затем статус
должен поменяться на R (выполняется) и через 20 секунд задача должна из очереди
исчезнуть. Если все прошло так как описано выше - мы в шаге от финала. Остается
только прикрутить выполнение полезной задачи к нашему кластеру.
PBS скрипты
Для запуска задач будем использовать PBS скрипты. PBS-скрипт - это обычный
shell скрипт в котором в виде специальным образом оформленных комментариев
начинающихся с #PBS можно передать менеджеру ресурсов необходимые параметры,
например: количество узлов и процессоров необходимых на задачу, количество
оперативной памяти, архитектуру узлов, время расчета и далее скрип и/или
программы которые необходимо выполнить на кластере.
Оформим тестовую задачу в виде PBS скрипта.
$ cat test.pbs
#!/bin/sh
#PBS -N test
#PBS -l nodes=2:ppn=4,walltime=00:00:50
#PBS -m abe
#PBS -M testuser@localhost
#PBS -V
echo "File containing nodes:"
echo $PBS_NODEFILE
echo "Nodes for computing:"
cat $PBS_NODEFILE
sleep 20
Значение параметров:
* -N - название задания, носит информативный характер
* -l - список ресурсов необходимых для выполнения вычисления
* -m - в каких случаях слать пользователю почтовое уведомдение
(a - задача отменена, b - задача начала выполняться, e- задача завершена).
* -M - на какой ящик отправлять уведомления.
* -V - экспортировать переменные окружения в скрипт.
запуск задания:
$ qsub test.pbs
При выполнении этого скрипта доступна одна важная переменная окружения
устанавливаемая менеджером ресурсов, это $PBS_NODEFILE. Переменная содержит
путь к файлу со списком узлов которые выделены нам для расчета в соответствии с
нашими запросами. Далее в зависимости от того как наше ПО производит
распараллеливание - обрабатываем в своем скрипте $PBS_NODEFILE и запускаем
необходимый расчет указывая свой программе на каких узлах и сколько процессоров
она может использовать. Правильно будет вынести все эти вычисления в отдельный
скрипт доступный пользователям для запуска, который будет вызываться
пользователями из своих PBS скриптов. Пример:
#!/bin/bash
#PBS -N test_2
#PBS -l nodes=2:ppn=4,walltime=00:00:50
#PBS -m abe
#PBS -M testuser@localhost
#PBS -V
#тут пользователь может установить свои переменные окружения необходимые для вычисления, например путь к данным
export DATADIR='/home/testuser/data'
...
#запускаем скрипт/программу которая обработает переменные и запустит вычисление на нужных узлах
/data/bin/my_super_programm
|