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