Pull to refresh

Вычислительный кластер своими руками

Задача: объединить несколько серверов в один вычислительный кластер, предоставить пользователям простой способ запуска своих задач не конфликтуя друг с другом.
Нам понадобятся: несколько серверов под управлением Linux(в моем случае это redhat), быстрый канал между серверами, ПО для организации очереди, вычислительное ПО умеющее распараллеливать вычисление на несколько узлов (например с помощью mpi), прямые руки…

Установка и настройка ПО

Torque — менеджер ресурсов, отвечает за отслеживание доступного количества ресурсов на узлах кластера и запуск задач.
Первым шагом устанавливаем torque на управляющий узел. Скачиваем исходники с 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


Очередей может быть несколько, задачи можно маршрутизировать в разные очереди с помощью списков доступа.

Далее устанавливаем torque на все вычислительные узлы кластера так же как и на управляющую ноду, единственное необходим скрипт запуска монитора pbs, а не сервера.
cp contrib/init.d/pbs_mon /etc/init.d/

На всех нодах указываем наш pbs сервер в файле /var/spool/torque/mom_priv/config:
$pbsserver s200 # s200 - это моя управляющая нода
$logevent 255 # bitmap of which events to log


Запускаем 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 позволяет гибко настроить различные стратегии заполнения кластера, приоритеты для задач по различным критериям: количеству запрашиваемых ресурсов, принадлежности пользователя к какой-то группе и т.д.

Скачиваем исходники с сайта 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-скрипт — это обычный 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 — экспортировать переменные окружения в PBS скрипт.

Запуск задания: $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/run_my_programm

Это все, остается написать короткую инструкцию пользователям по оформлению PBS файла и можно спокойно отдыхать, все счастливы.

Более подробно о параметрах настройки менеджеров ресурсов и очереди см.:
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.