Описание и технические характеристики оборудования
На данный момент кластер состоит из 4-х машин, объединенных в сеть на скорости 1 Гб/сек. через 16-ти портовый коммутатор. Все машины оснащены cd-rom, fdd, управляющая машина оснащена, также dvd-rw. Последний в перспективе можно использовать для кодирования DVD-видео с помощью пакета rvd::rip, который работает на основе технологии PVM.
ТТХ:
Процессор: 2xAMD Athlon MP 2400+
ОЗУ: 1024 Мб
HDD (на управляющей машине): 80 Гб. Maxtor 6Y080L0
Сеть:
1. 3com Corporation 3c905C-TX/TX-M (Tornado)
2. (на управляющей машине 2-я сетевая карта для связи с внешней сетью) D-link Systems Inc. RTL9139 Ethernet
ОС:RedHat Enterprice Linux 4 – Advanced Server
gcc: 3.4.5 20051201
lam: 7.0.6-5
pvm: 3.4.4-21
Настройка HPC MPI кластера с бездисковыми станциями
Ставим операционку, лучше, как впоследствии выяснилось RHEL-4 AS. При установке, выбираем обязательно «научные приложения» и в них, доотмечаем lam и pvm. Также не забываем про mc, tftp, dhcp, nfs, syslinux, system-config-netboot (если есть в дистрибутиве)
Подготовка ОС для бездисковых станций
После установки ОС. Создаем папку-корень для бездисковой станции:
mkdir –p /diskless
mkdir –p /diskless/root
Копируем корневую файловую систему в папку /diskless/root:
rsync –v –a –e ssh –exclude='/proc/' --exclude='/sys/*' –exclude='/diskless/*' 192.168.31.1:/ /diskless/root
Настраиваем DHCP
Настраиваем dhcp. Вот пример конфига для 3-х бездисковых рабочих станций, добавляются они по-аналогии, MAC адреса переписать самое главное. Настройки хранятся в файле /etc/dhcpd.conf
dhcpd.conf
#
# DHCP Server Configuration file.
# see /usr/share/doc/dhcp*/dhcpd.conf.sample
default-lease-time 600;
max-lease-time 7200;
authoritative;
ddns-update-style none;
option domain-name "cluster";
option routers 192.168.31.1;
option domain-name-servers 192.168.31.1;
option swap-path code 128 = string;
option swap-size code 129 = integer 32;
subnet 192.168.31.0 netmask 255.255.255.0 {
range 192.168.31.11 192.168.31.21;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.31.255;
group {
filename "linux-install/pxelinux.0";
option root-path "/diskless/root";
next-server 192.168.31.1;
host m01 {
option host-name "m01.cluster";
hardware ethernet 00:E0:81:25:63:50;
fixed-address 192.168.31.11;
}
host m02 {
option host-name "m02.cluster";
hardware ethernet 00:E0:81:25:01:FA;
fixed-address 192.168.31.12;
}
host m03 {
option host-name "m03.cluster";
hardware ethernet 00:E0:81:25:63:6A;
fixed-address 192.168.31.13;
}
}
}
allow booting;
allow bootp;
Также в файле /etc/sysconfig/dhcpd указываем серверу слушать только eth0 в нашем случае, это внутренняя сеть кластера
# Command line options here
DHCPDARGS=eth0
Настраиваем NFS
Настраиваем nfs для экспорта файловых систем для бездисковых станций. Настройки хранятся в файле /etc/exports
/etc/exports:
#read
/diskless/root 192.168.31.0/24(ro,sync,no_root_squash)
#
/usr/local 192.168.31.0/24(ro,sync,no_root_squash)
#
/diskless/snapshot 192.168.31.0/24(rw,sync,no_root_squash)
#
#/diskless/swap 192.168.31.0/24(rw,sync,no_root_squash)
#/home
/home 192.168.31.0/24(rw,sync,no_root_squash)
#opt
/opt 192.168.31.0/24(ro,sync,no_root_squash)
Здесь несколько моментов /diskless/swap/ с ним еще не ясно, поэтому закомментируем. «Своп по сети» мне кажется не очень хорошей идеей. Нужно попытаться настроить своп на клиенте, об этом позже.
Настраиваем NTP
Настраиваем ntp для синхронизации времени на сервере и на нодах. Настройки хранятся в файле
/etc/ntp.conf:
restrict 192.168.31.0 mask 255.255.255.0 nomodify notrap
restrict 127.0.0.1
restrict 127.127.1.0
restrict 127.127.27.0 nomodify
server 127.127.1.0 #local
fudge 127.127.1.0 stratum 10
driftfile /var/lib/ntp/drift
broadcastdelay 0.008
keys /etc/ntp/keys
Настройка служб на сервере
С конфигами разобрались. Теперь идем в настройки служб и проверям включен ли автозапуск служб portmap, nfs, nfslock, ntp, xinetd,, tftp, dhcpd. Сохраняем перегружаем машину.
Создание бездискового окружения
Теперь создадим бездисковое окружение и добавим клиентов. Запускаем утилиту system-config-netboot. При первом запуске появляется мастер: на первом шаге будет предложено скопировать корневую файловую систему в каталог корня для бездисковых станций, нажимаем далее, мы уже это сделали. На следущем слайде надо задать имя сети и описание, далее, затем задаем ip адрес nfs сервер, в нашем случае ip нашей машины 192.168.31.1 и корневой каталог для бездисковых станций, в нашем случае это /diskless/root, далее, если все сконфигурировано верно, то на след. Шаге будет выведен список доступных ядер, отмечаем необходимое, далее, все создано бездисковое окружение.
Добавление бездисковых клиентов
Теперь добавляем клиентов. В появившемся пустом окне нажимаем кнопку добавить вводим ip адрес клиента, например 192.168.31.13. Опции ядра оставляем пустыми, вводим название «снимка» (это будет папка в /diskless/snapshot/ в которой будут хранится настройки уникальные для каждой бездисковой станции) например m03. Опции логов по-вкусу. Нажимаем OK. Все станция добавлена.
Создание уникальной для каждой машины конфигурации
Редактируем настройки бездисковой станции. Идем в папку /diskless/snapshot/<название снимка>/etc
Там добавляем в файл fstab строчки для монтирования коневой файловой системы и наших экспортированных файловых систем (их количество и качество зависит от пожеланий кластеростроителя). Я монтирую корневую /, /home, /opt.
/etc/fstab:
192.168.31.1:/diskless/root / nfs defaults,ro 0 0
192.168.31.1:/home /home nfs defaults,rw 0 0
192.168.31.1:/opt /opt nfs defaults,ro 0 0
Службы
Теперь необходимо отключить на бездисковых станциях ненужные службы. Для этого необходимо chroot’нуться в корень станции, выглядит это так:
su
<пароль>
cd /diskless
/sbin/chroot root
Все теперь мы находимся в «песочнице» бездисковой станции и каталог /diskless/root становиться для текущего сеанса с терминалом корневым, если закрыть терминал или открыть новую вкладку, то там все будет «по-старому».
Смотрим какие службы вообще работают. Для удобства я обычно открываю графическую утилиту настройки служб и сверяюсь с ней system-config-services. Смотрим список служб:
/sbin/chkconfig –list
Листинг списка служб для всех «нод»:
crond | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
---|---|---|---|---|---|---|---|
cups | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
microcode_ctl | 0:выкл | 1:выкл | 2:вкл | 3:вкл | 4:вкл | 5:вкл | 6:выкл |
cpuspeed | 0:выкл | 1:вкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
rpcgssd | 0:выкл | 1:выкл | 2:выкл | 3:вкл | 4:вкл | 5:вкл | 6:выкл |
mdmonitor | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
arptables_jf | 0:выкл | 1:выкл | 2:вкл | 3:вкл | 4:вкл | 5:вкл | 6:выкл |
rusersd | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
vncserver | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
portmap | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
lm_sensors | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
messagebus | 0:выкл | 1:выкл | 2:выкл | 3:вкл | 4:вкл | 5:вкл | 6:выкл |
snmpd | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
anacron | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
bootparamd | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
autofs | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
rhnsd | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
rawdevices | 0:выкл | 1:выкл | 2:выкл | 3:вкл | 4:вкл | 5:вкл | 6:выкл |
pcmcia | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
sshd | 0:выкл | 1:выкл | 2:вкл | 3:вкл | 4:вкл | 5:вкл | 6:выкл |
nfs | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
ypbind | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
network | 0:выкл | 1:выкл | 2:вкл | 3:вкл | 4:вкл | 5:вкл | 6:выкл |
xfs | 0:выкл | 1:выкл | 2:вкл | 3:вкл | 4:вкл | 5:вкл | 6:выкл |
apmd | 0:выкл | 1:выкл | 2:вкл | 3:вкл | 4:вкл | 5:вкл | 6:выкл |
psacct | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
gpm | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
saslauthd | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
netfs | 0:выкл | 1:выкл | 2:выкл | 3:вкл | 4:вкл | 5:вкл | 6:выкл |
NetworkManager | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
xinetd | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
bluetooth | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
winbind | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
sendmail | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
smb | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
acpid | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
mdmpd | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
iptables | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
dc_client | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
tux | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
syslog | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
isdn | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
rstatd | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
smartd | 0:выкл | 1:выкл | 2:вкл | 3:вкл | 4:вкл | 5:вкл | 6:выкл |
nfslock | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
cups-config-daemon | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
snmptrapd | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
squid | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
atd | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
irqbalance | 0:выкл | 1:выкл | 2:выкл | 3:вкл | 4:вкл | 5:вкл | 6:выкл |
readahead | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:вкл | 6:выкл |
rpcidmapd | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
haldaemon | 0:выкл | 1:выкл | 2:выкл | 3:вкл | 4:вкл | 5:вкл | 6:выкл |
ntpd | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
irda | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
readahead_early | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:вкл | 6:выкл |
diskdump | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
dc_server | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
rwhod | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
diskless | 0:выкл | 1:выкл | 2:выкл | 3:вкл | 4:выкл | 5:вкл | 6:выкл |
dhcrelay | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:вкл | 6:выкл |
netplugd | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
kudzu | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
netdump | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
dhcpd | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
nscd | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
httpd | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
auditd | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
rarpd | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
ipmi | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
named | 0:выкл | 1:выкл | 2:выкл | 3:выкл | 4:выкл | 5:выкл | 6:выкл |
Анализируем вывод комманды, отключаем практически все. В первую очередь к отключению nfs, ntp, dhcpd, anacron, cron, kudzu и т.д.
По завершении настройки служб на бездисковой станции, закрываем терминал, чтобы выйти из «песочницы». Можно запустить бездисковую станцию, лучше сначала эксперименты ставить с одной станцией, остальные недолго добавить по-аналогии.
Подготовка BIOS бездисковой машины
Предполагается, что станция включается впервые. На ней в биосе нужно выставить приоритет загрузки, вначале PXE!. Запускаем, если запустилась, можно не обращать внимания на сбои в запуске некоторых служб, это сейчас не важно.
Настройка беспарольного входа
На данном этапе имеем настроеную(ые) бездисковые станции. Теперь для необходимости работы системы lam-mpi необходимо настроить беспарольный вход с главной машины кластера на «ноды» (бездисковые станции). Это непременное условие работоспособности всей системы.
Алгоритм обеспечения беспарольного доступа следующий:
Логинимся к консоли кластера:
ssh user1@server
Переходим в каталог ssh:
cd ~/.ssh
Генерируем rsa-ключи:
ssh-keygen -t rsa
На вопрос задать имя файла жмем Enter — остается имя по умолчанию id_rsa.
На просьбу задать пароль жмем Enter два раза (второй раз для проверки).
Копируем публичный ключ на узел кластера:
scp id_rsa.pub user1@node1:~/.ssh
Логинимся к узлу node1:
ssh user1@node1
Переходим в каталог ssh:
cd ~/.ssh
Копируем публичный ключ:
cat id_rsa.pub >> authorized_keys2
Отключаемся от узла node1
Повторяем пункты 6-10 для остальных узлов кластера (node2 … nodeN)
И еще один момент для файла authorized_keys2 выставить права доступа 600. Можно это сделать прямо на сервере, благо дирректория /home у нас экспортируется на все машины и изменения сразу же отразятся на всех «нодах» Делается это командой chmod:
cd ~./ssh
chmod 600 autorized_keys2
Настройка системы LAM-MPI
Теперь наступает ответственный момент, необходимо проверить работоспособность lam-mpi системы. С помощью команды locate находим файл lam-bhost.def
su
<пароль>
updatedb
exit
locate lam-bhost.def
В этом файле уже будет одна машина – localhost. Просто закомментируйте эту строчку и допишите новые строки с перечнем машин и количеством процессоров на них, если оно отличается от единицы. Пример:
192.168.31.1 cpu=2
192.168.31.11 cpu=2
192.168.31.12 cpu=2
192.168.31.13 cpu=2
Я в качестве названия указываю ip адрес, у этого подхода есть свой плюс, не надо настраивать dns. Сохраняем.
В системе LAM-MPI предусмотрена программа проверки работоспособности recon. Алгоритм ее работы таков: в соответствии с выбранным типом аутентификации recon пробует соединиться с машинами из конфигурационного файла lam-bhost.def если соединение удачное (удачным считается отсутствие какого-либо вывода на консоль при попытке соединения с удаленной машиной, для этого и настраивается беспарольный доступ), то происходит попытка запуска какого-либо приложения напримеp ps.
Вводим команду recon если она скажет Woo Hoo! То значит все настроено, верно. И можно запустить «вселенную» lam, это делается коммандой:
lamboot –v
Запускать ее нужно от имени того пользователя, для которого настроен беспарольный вход на ноды кластера. Теперь проверим, какие машины у нас участвуют в системе. Даем комманду lamnodes и смотрим вывод. По идее их количество должно совпадать с перечнем в lam-bhost.def. Это конфигурационный файл lam он находится в /etc/lam/lam-bhost.def
Можно попробовать запустить какую-нибудь программу, например cpi. Загрузка программ на исполнение в системе mpi производится с помощью специального загрузчика mpirun. Пример запуска:
mpirun –np 4 cpi
Разберем данную комманду. Загрузчику mpirun передается в параметрах –np <количество процессов> в идеале должно бы по-одному на каждый процессор! Ну и, собственно, название программы. Следует учесть, что предварительно необходимо перейти в каталог с программой.
Установка системы мониторинга GANGLIA
Ganglia это масштабируемая системы для мониторинга распределенных высокопроизводительных вычислительных систем, таких как кластеры и сети. Она основана на иерархической структуре кластеров. Используются технологии, такие как XML для представления данных, XDR для компактных портативных передачи данных, и RRDtool для хранения данных и визуализации. При мониторинге используются тщательно отлаженные инженерных структуры данных и алгоритмы для достижения низкой нагрузки на узлы.
Исходные тексты всегда можно загрузить на официальном сайте проекта ganglia.
Сама процедура установки сложностей не представляет:
tar -zxvf ganglia-3.0.6.tar.gz
cd ganglia-3.0.6
./configure --with-gmetad
make
make install
Настройка веб-сервера. Для настройки необходимо отредактировать конфигурационный файл, он располагается в каталоге:
/var/www/html/ganglia/conf.php
Рассмотрим выдержку из данного конфига, т.к. остальное его содержимое нас не интересует.
Рассмотрим его содержание:
Jobmonarch состоит из 3-х частей:
- Jobmond – собирает XML-статистику от модуля Gmond, демон Jobmond написан на Python и должен быть запущен. На данный момент поддерживаются следущие системы управления заданиями: PBS, Torque.
- Jobarchived – модуль архивации и записи в базу данных XML-отчетов, статистики по нодам. В качестве СУБД предписано использовать Postgres
- WEB – фронтэнд для Jobmonarch
Установка
Заключается в копировании демонов в каталог /usr/local/sbin
cp jobmond/jobmond.py /usr/local/sbin/jobmond.py
cp jobmond/jobmond.conf /etc/jobmond.conf
Создаем базу для jobarchived:
createdb jobarchive
psql -f jobarchived/job_dbase.sql jobarchive
cp jobarchived/jobarchived.conf /etc/jobarchived.conf
cp jobarchived/jobarchived.py /usr/local/sbin/jobarchived.py
Установка WEB-фронтэнда:
cp -a web/templates/job_monarch /var/www/html/ganglia/templates
cp -a web/addons/job_monarch /var/www/html/ganglia/addons
Конфигурирование
Необходимо отредактировать:
- /etc/jobmond.conf,
- /etc/jobarchived.conf,
- /var/www/html/ganglia/conf.php,
- /var/www/html/ganglia/addons/job_monarch/conf.php
/etc/jobmond.conf:
BATCH_SERVER : localhost
GMETRIC_TARGET : cluster.vtpm.local:8649
Необходимо найти директивы и установить их в соответствие с текущими параметрами. В GMETRIC_TARGET прописать имя машины и порт на котором висит демон gmetad.
/etc/jobarchived.conf:
GMETAD_CONF : /etc/gmetad.conf
ARCHIVE_XMLSOURCE : cluster.vtpm.local:8651
ARCHIVE_DATASOURCES : "MSAU_Cluster"
JOB_SQL_DBASE : localhost/jobarchive
RRDTOOL : /usr/bin/rrdtool
Также необходимо вышеприведенные директивы установить в соответствие с текущими настройками систем. GMETAD_CONF – указать расположение конфигурационного файла демона gmetad. ARCHIVE_XMLSOURCE – источник XML – данных для переработки и записи в базу. ARCHIVE_DATASOURCES – очень важный момент, имя кластера должно полностью совпадать с соответствующим в настройках Ganglia. JOB_SQL_DBASE – имя базы для хранения архивных данных. RRDTOOL – путь к предварительно установленной утилите RRDTool.
/var/www/html/ganglia/conf.php:
$template_name = "job_monarch";
В конфиге Ganglia необходимо указать использование шаблона Job_monarch
/var/www/html/ganglia/addons/job_monarch/conf.php:
$GANGLIA_PATH = "/var/www/html/ganglia";
$DATA_SOURCE = '127.0.0.1:8651';
$JOB_ARCHIVE_DBASE = "127.0.0.1/jobarch";
$RRDTOOL = "/usr/bin/rrdtool";
В конфиге WEB-фронтэнда jobmonarch подлежат изменению следующие директивы: $GANGLIA_PATH – указать путь к WEB – интерфейсу Ganglia, $DATA_SOURCE – адрес демона Ganglia, $JOB_ARCHIVE_DBASE – адрес и имя базы данных для хранения архива, $RRDTOOL – путь к утилите RRDTool
Настройка системы PVM
Если абстрагироваться от вопроса программирования и технической реализации, то в целом система PVM представляет собой некий аналог LAM-MPI. Так же как и в LAM-MPI для работы необходим демон, который загружается на каждой используемой «ноде», на его плечи ложиться весь труд по организации обмена сообщениями между запущенными на разных машинах процессами. Отличие заключается только в том, что для пользователя – программиста, PVM представляется единой машиной с виртуальной консолью, к которой можно подключаться, точно так же, если бы это была «физическая» машина. Система LAM-MPI позволяет запускать на исполнение параллельные программы, но той виртуальной «монолитности» уже нет.
Установка системы. Для успешного запуска системы необходимо отредактировать файл /etc/hosts чтобы он содержал следующие записи:
127.0.0.1 localhost.localdomain localhost
192.168.31.1 cluster.vtpm.local cluster
192.168.31.11 m01.cluster m01
192.168.31.12 m02.cluster m02
192.168.31.13 m03.cluster m03
Не следует забывать, что при любых изменениях конфигурационных файлов, их необходимо также переносить и в директорию бездисковых станций, в нашем случае, это /diskless/root.
Для обеспечения максимальной производительности лучше сразу собирать пакет из исходных текстов, либо пересобрать программу установленную из rpm-пакета. Перед выполением компиляции необходимо добавить в файл ~./.bashrc содержимое файла /usr/share/pvm3/lib/bashrc.stub
По умолчанию PVM использует протокол rsh для общения с другими компьютерами кластера. Если вы хотите rsh заменить на ssh, вы должны изменить файл /pvm3/conf/LINUX.def, прописав в переменной ARCHCFLAGS параметр RSHCOMMAND, определив для него полный путь к команде ssh (например /usr/bin/ssh).
Например, на моем кластере файл /pvm3/conf/LINUX.def выглядит так:
ARCHCFLAGS = -DSYSVSIGNAL -DNOWAIT3 -DRSHCOMMAND=\"/usr/bin/ssh\" -DNEEDENDIAN -DFDSETNOTSTRUCT -DHASERRORVARS -DCTIMEISTIMET -DSYSERRISCONST -DNOTMPNAM
ARCHDLIB =
ARCHDOBJ =
ARCHLIB =
HASRANLIB = t
AR = ar
PVM_ARCH = LINUX
MAKE = make
Затем последовательно выполняем комманды:
cd /usr/share/pvm3
make
Затем необходимо перезагрузить систему. Если при установке выбрать пакет PVM, то он создан в стандартной директории /usr/bin/pvm скрипт для запуска PVM. Необходимо отредактировать для того чтобы использовать ssh вместо rsh:
/usr/bin/pvm:
#!/bin/sh
PVM_ROOT=/usr/share/pvm3
if [ "$PVM_RSH" = "" ]; then
export PVM_RSH="/usr/bin/ssh" #здесь необходимо заменить на ssh
fi
export PVM_ROOT
exec /usr/share/pvm3/lib/pvm "$@"
После перезагрузки можно запустить PVM для этого необходимо выполнить комманду:
pvm
Появится приглашение консоли:
pvm>
Теперь необходимо добавить в машины, делается это командой add, например:
pvm>add m01
pvm>add 192.168.31.11
pvm>add m01.cluster
Команда add позволяет задавать имя машины как в виде ip-адреса, так и в виде короткого и полного имени компьютера. В случае успешного добавления будет выводиться сообщение:
pvm>add 192.168.31.11
add 192.168.31.11
yuri@node1's password:
1 successful
HOST DTID
192.168.31.11 80000
pvm>
Тестирование производительности
HPL
Тест HPL написан с использованием библиотеки Linpack. Она была разработана для работы на суперкомпьютерах, которые использовались в 1970-х и начале 1980-х годов. В настоящее время Linpack заменила другая библиотека – Lapack, которая работает более эффективно на современных компьютерах. Существуют версии библиотеки для чисел c плавающей точкой с разной точностью и для комплексных чисел. Появилась реализация библиотеки, написанная на Си.
На базе этой библиотеки был создан тест Linpack benchmark. Тест оценивает количество операций с плавающей точкой (FLOPS) в секунду. На основе этого теста составляется список 500 самых быстрых компьютеров мира. http://www.top500.org/
Для установки теста необходимо:
— наличие одной из реализаций MPIустановленная библиотека BLAS + VSIPL или ATLAS или goto_BLAS.
- наличие последней более предпочтительно, т.к. она значительно более оптимизирована под современные процессоры
Установка MPICH
Ничего сложного собой не представляет.
tar -xzvf mpich.tar.gz
./configure –-prefix=/opt/mpich -–with-device=ch_p4 -–rsh=/usr/bin/ssh
make && make install
Конфигурация перед сборкой выполнена с назначение целевой директории, которую необходимо создать перед установкой. Это сделано, для того, чтобы не устанавливать mpich для бездисковых машин, благо у нас директория /opt экспортируется на все машины кластера.
Установка goto_BLAS. Будем так же устанавливать в директорию /opt.
mkdir /opt/goto_BLAS
tar zxvf GotoBLAS-<версия>.tar.gz
Следующим шагом нам необходимо отредактировать Makefile.rule:
BINARY64=0 #запрещаем использование 64 битных инструкций
SMP=1 #устанавливаем, многопроцессорную архитектуру
MAX_THREADS=2 #максимальное количество потоков на машину (2 процессора -2 потока)
Собираем:
./quickbuild.32bit
В итоге получаются 2 бинарника: libgoto_athlonp-r1.23.so и libgoto¬_athlonp-r1.23.a
Их необходимо скопировать в папку с исходниками HPL, что мы и выполним следующим шагом.
Установка HPL. Для успешной сборки необходимо создать Makefile, соответствующий нашей архитектуре, установленным библиотекам, пути к ним, успользуемым компиляторам и т.д.
Пример моего файла:
# Пример Make файла для компиляции HPL
#################
# SHELL#
#################
SHELL = /bin/sh
CD = cd
CP = cp
LN_S = ln -s
MKDIR = mkdir
RM = /bin/rm -f
TOUCH = touch
####################
#Название платформы#
####################
ARCH = mpich_goto
#########################
#Структура каталогов HPL#
#########################
TOPdir = /opt/hpl
INCdir = $(TOPdir)/include
BINdir = $(TOPdir)/bin/$(ARCH)
LIBdir = $(TOPdir)/lib/$(ARCH)
HPLlib = $(LIBdir)/libhpl.a
#############################
#Опции компилятора и линкера#
#############################
CC = /opt/mpich/bin/mpicc
NOOPT =
CCFLAGS = -fomit-frame-pointer -O3 -funroll-loops -Bstatic
# На некоторых платформах необходимо указать линкер для Fortran
LINKER = /opt/mpich/bin/mpif77
LINKFLAGS = $(CCFLAGS) -lm -B static
ARCHIVER = ar
ARFLAGS = r
RANLIB = echo
#####
#MPI#
#####
# Настройки для подключения библиотеки MPI здесь не нужны.
# Они учтены в скриптах mpiсс, mpif77
MPdir =/opt/mpich
MPinc = -I$(MPdir)/include
MPlib = -L$(MPdir)/lib $(MPdir)/lib/libmpich.a
######
#BLAS#
######
# LAdir – каталог установки BLAS
# LAinc – каталог заголовочных файлов BLAS
# LAlib – путь к библиотекам
# F2CDEFS не определяется в случае использования интерфейса на языке с к
# библиотеке BLAS
F2CDEFS =
LAdir = /opt/hpl
LAinc =
#LAlib = $(LAdir)/libcblas.a $(LAdir)/libatlas.a
#LAlib = $(LAdir)/libPLAPACK.a
LAlib =$(LAdir)/libgoto_athlonp-r1.23.a
#
# Опции компилятора и линковщика указывающие пути к заголовочным файлам
# и библиотекам
#
HPL_INCLUDES = -I$(INCdir) -I$(INCdir)/$(ARCH) $(LAinc) $(MPinc)
HPL_LIBS = $(HPLlib) $(LAlib) $(MPlib)
#
# Используем интерфейс С к BLAS
#
HPL_OPTS = -DHPL_CALL_CBLAS
#
# ----------------------------------------------------------------------
#
HPL_DEFS = $(F2CDEFS) $(HPL_OPTS) $(HPL_INCLUDES)
#
# ----------------------------------------------------------------------
Данный файл создаем в директории /opt/hpl, он называется Make.mpich_goto, соответственно команда для сборки будет выглядеть так:
cp libgoto* /opt/hpl
cd /opt/hpl
make arch=mpich_goto
После чего в директории /opt/hpl/bin/mpich_goto появятся 2 файла, один xhpl – бинарный файл, другой HPL.dat – содержит описание настроек для запуска теста.
HPLinpack benchmark input file
Innovative Computing Laboratory, University of Tennessee
HPL.out output file name (if any)
6 device out (6=stdout,7=stderr,file)
1 # of problems sizes (N)
35 Ns
1 # of NBs
20 NBs
0 PMAP process mapping (0=Row-,1=Column-major)
1 # of process grids (P x Q)
1 Ps
2 Qs
16.0 threshold
3 # of panel fact
0 1 2 PFACTs (0=left, 1=Crout, 2=Right)
2 # of recursive stopping criterium
2 4 NBMINs (>= 1)
1 # of panels in recursion
2 NDIVs
3 # of recursive panel fact.
0 1 2 RFACTs (0=left, 1=Crout, 2=Right)
1 # of broadcast
0 BCASTs (0=1rg,1=1rM,2=2rg,3=2rM,4=Lng,5=LnM)
1 # of lookahead depth
0 DEPTHs (>=0)
2 SWAP (0=bin-exch,1=long,2=mix)
64 swapping threshold
0 L1 in (0=transposed,1=no-transposed) form
0 U in (0=transposed,1=no-transposed) form
1 Equilibration (0=no,1=yes)
8 memory alignment in double (> 0)
Предварительно необходимо указать mpich доступные машины, записываем их в файл /opt/mpich/share/examples. Команды для запуска теста:
cd /opt/hpl/bin/mpich_goto
/opt/mpich/bin/mpirun –np 8 ./xhpl
Для различных параметров –np необходимо подбирать соответствующих размер матрицы, для этого перед каждым прогоном редактируем файл HPL.dat изменяя в нем параметры Ps и Qs.
Таблица 1
Таблица соответствия размера матрицы количеству запускаемых процессов
Значение | -np 2 | -np 4 | -np 6 | -np 8 |
---|---|---|---|---|
Ps | 1 | 1 | 1 | 1 |
Qs | 2 | 4 | 3 | 4 |
Таблица 2
Таблица прогона теста при различных значениях параметра –np
Тест | -np 2 | -np 4 | -np 6 | -np 8 |
---|---|---|---|---|
WR00L2L2 | 1.164e-03 | 1.247e-03 | 2.168e-03 | 2.386e-03 |
WR00L2L4 | 1.199e-03 | 1.712e-03 | 8.657e-03 | 8.642e-03 |
WR00L2C2 | 1.208e-03 | 1.744e-03 | 8.916e-03 | 9.277e-03 |
WR00L2C4 | 1.243e-03 | 1.735e-03 | 9.312e-03 | 9.306e-03 |
WR00L2R2 | 1.239e-03 | 1.778e-03 | 9.430e-03 | 9.453e-03 |
WR00L2R4 | 1.266e-03 | 1.845e-03 | 9.551e-03 | 9.524e-03 |
WR00C2L2 | 1.220e-03 | 1.710e-03 | 7.240e-03 | 9.255e-03 |
WR00C2L4 | 1.211e-03 | 1.718e-03 | 9.185e-03 | 9.263e-03 |
WR00C2C2 | 1.216e-03 | 1.740e-03 | 9.336e-03 | 9.329e-03 |
WR00C2C4 | 1.228e-03 | 1.689e-03 | 9.337e-03 | 9.378e-03 |
WR00C2R2 | 1.245e-03 | 1.726e-03 | 9.533e-03 | 9.533e-03 |
WR00C2R4 | 1.249e-03 | 1.810e-03 | 9.309e-03 | 9.450e-03 |
WR00R2L2 | 1.251e-03 | 1.787e-03 | 9.442e-03 | 9.380e-03 |
WR00R2L4 | 1.249e-03 | 1.789e-03 | 9.483e-03 | 9.462e-03 |
WR00R2C2 | 1.250e-03 | 1.773e-03 | 9.445e-03 | 9.433e-03 |
WR00R2C4 | 1.249e-03 | 1.770e-03 | 9.468e-03 | 9.421e-03 |
WR00R2R2 | 1.278e-03 | 1.905e-03 | 9.557e-03 | 9.539e-03 |
WR00R2R4 | 1.277e-03 | 1.888e-03 | 9.677e-03 | 9.688e-03 |
Среднее значение | 1.407e-03 | 1.853e-03 | 8.835e-03 | 8.984e-03 |
Вывод:
На основе данных прогона теста HPL с различными параметрами (размером матрицы, количеством процессов, размером пересылаемого блока и т.д.) определился максимально достижимый на практике «потолок» производительности кластера. Напомню, что кластер состоит из 4-х одинаковых машин, в каждой 2 процессора Athlon MP 2Ghz и 1Gb ОЗУ. «Потолок» производительности, так называемая «пиковая производительность» равна 9,7 GFlop.
POVRAY
Благодаря доступности и распространенности, Povray часто используется для тестов производительности компьютеров, а полученные результаты публикуются в Интернете.
Например, на сайте http://www.tabsnet.com отмечается время рендеринга с определенными настройками качества и размера одной и той же картинки — модели с шахмат на разных вычислительных платформах.
Сборка и установка дистрибутива povray
Оригинальный дистрибутив не имеет возможности распараллеливания процесса рендеринга и вообще использования технологии MPI. Для получения данной возможности необходима пересборка povray с наложением патча от Andreas Dilger данный патч добавляет в исходный код процедуры для взаимодействия с библиотекой lam/mpi. Есть также модификация povray под PVM.
Процесс установки и сборки выглядит следующим образом:
- Скачиваем архив с исходными текстами povray версии 3.1g с www.povray.org
- Также необходим сам патч mpi-povray-1.0.patch.gz он написан строго под версию 3.1g
- Распаковываем povray:tar xvfz povuni_s.tga
- Накладываем патч:
cd povray31; gzip -dc mpi-povray*.patch.gz | patch -p1
- Переходим в директорию для сборки исполняемого файла:
cd povray31/source/mpi-unix
- Необходимо отредактировать Makefile для выбора типа архитектуры и задания ключей оптимизации. Находим в файле Makefile строку вида:
CFLAGS = -O6 –finline-functions –ffast-math –c –ansi –march=i386 –DCPU=i586 –DCOMPILER_VER=\”.
uname
.$(CC)\” –DPOV_LIB_DIR=\”$(POVLIBDIR)\” $(SRCINC) $(LIBPNGINC) $(ZLIBINC) $(MPIINC)
В данной строке ключевое значение имеют директивы –march и –DCPU, у меня они заданы –march=i386 и –DCPU=i586 соответственно.
7. Собираем исполняемый файл: make newxwin
8. Структура команды запуска povray на исполнение:
mpirun -np ? ./mpi-x-povray [options]
В качестве измерения производительности кластера, помимо расчета классического числа pi. Можно использовать более наглядные методы, например рендеринг изображений, что все-таки более полезно. Рассмотрим ряд распространенных тестов. Например, skyvase.pov, chess2.pov.
Тест skyvase.pov
Вся суть теста заключается в рендеринге изображения и регистрации затраченного времени.
Скачивается специальный файл для Povray под названием skyvase.pov он представляет из себя описание приведенной выше вазы, на основе которого будет происходить рендеринг изображения. Povray у нас установлен в директорию:
/home/vrn/p/povray31/source/mpi-unix
Команда для запуска рендеринга будет выглядеть следующим образом:
cd /home/vrn/p/povray31/source/mpi-unix
mpirun –np 8 ./mpi-x-povray –i skyvase.pov +v1 –d +ft –x +a0.300 +r3 –q9 –w640 –h480 –mv2.0 +b1000 +L../../include
lamclean
Как я уже рассказвал чуть выше. Запускаем с помощью загрузчика mpirun в качестве количества процессов, выбираем по одному на каждый процессор, у нас их 8 поэтому параметр выглядит следующим образом:
-np 8
Далее идет запуск пропатченного и собранного povray из текущей директории, затем указываются параметры для самого povray.
В заключение этого теста можно сделать следующие выводы: минимально достижимое время это 2 сек., наступает после запуска 6 процессов. Дальнейшее наращивание количества процессов никакой роли не играет (замечу, что при запуске 6 процессов задействуются только 3 машины, 4-я стоит без дела). Сей факт наводит на мысль о том, что или мы уже начинаем «упираться» в пропускную способность сети кластера или просто тест так написан.
Тест chessmark
Теперь рассмотрим популярный тест chessmark с сайта tabsnet.de Вот изображение, которое получается в итоге:
Строка для запуска теста на нашем кластере выглядит следующим образом:
mpirun –np 9 ./mpi-x-povray –d –q9 +w800 +h600 +b1000 +r3 +a0.300 +ft –i../../scenes/advanced/chess2.pov +L../../include
Тем самым запускаем 9 процессов (максимально допустимое полезное количество). Посмотрев в список задач, я обнаружил два процесса, один из которых занимал 100% вычислительных ресурсов, а второй… как будто ничего не делал. Запуск с ключом -np 3 подтвердил догадку, дав выигрыш в производительности! Таким образом, оптимальное количество процессов рассчитывает по формуле, с учетом того, что у нас 2-х процессорные машины и собрано специальное ядро для многопроцессорных машин:
формула (1)
Где Knp – значение параметра –np для загрузчика mpirun, Kм – количество доступных машин. Тем самым и получаем искомое значение в 9 процессов. 8 рабочих и 1 управляющий, см. рис. ниже.
Результаты теста:
Минимально достижимое время составляет 47 секунд. Данный результат показывает, что мы должны находиться на 15-й строчке в итоговом протоколе результатов.
По результатам этого теста могу сделать следующий вывод:
Данный тест более корректный, чем предыдущий, так как время работы системы значительно больше и уже можно отбросить гипотезу, «упираемся в потолок производительности сети». Но в целом кривая результатов схожая. И дальнейшее увеличение количества процессов никакого выигрыша в производительности не играет. Таким образом, мы вывели формулу для оптимального количества процессов для запуска на кластере (1).
Сборка и установка системы transcode
Пакет transcode предназначен для кодирования видео и аудио файлов в различные форматы. Самый важный для нас момент заключается в том, что пакет transcode можно собрать с поддержкой pvm3 и получить выигрыш в производительности. А, как всем известно, сжатие и перекодирование мультимедийных файлов является одной из самых «тяжелых» для процессора операций. Так же он хорош тем, что для него существует специальная надстройка dvd::rip с удобным графическим интерфейсом.
Для установки transcode необходимо иметь полностью настроенную систему PVM, а также минимально необходимый перечень кодеков, для работы с различными форматами мультимедиа. Вот их краткий перечень:
- ffmpeg
- libavcodec
- mpeg2dec
- libmpeg2
- libmp3lame
- libdvdread
Качаем архив с http://www.transcoding.org/. Я пробовал собирать версии 1.0.4 и 1.0.5, последняя собираться отказалась.
Для того чтобы при сборке не иметь проблем с ffmpeg, последнего необходимо сконфигурировать для поддержки динамической линковки библиотек, для этого команду конфигурации перед сборкой необходимо выполнить со следующими параметрами:
./configure --enable-pp --enable-liba52 --enable-liba52bin --enable-libmp3lame --enable-libvorbis --enable-gpl --enable-x11grab --enable-shared
Распаковываем куда-нибудь архив с исходниками. Переходим в папку с распакованными исходниками и конфигурируем transcode:
env CFLAGS="-O3 -march=athlon" ./configure --enable-pvm3 --with-pvm3-includes=/usr/share/pvm3/include --with-pvm3-libs=/usr/share/pvm3/lib/LINUX --with-libavcodec-prefix=/usr/local --with-libavcodec-includes=/usr/local/include --enable-netstream --with-libmpeg2-prefix=/usr/local --with-libmpeg2-includes=/usr/local/include --with-libmpeg2-libs=/usr/local/lib --with-x --enable-libpostproc --with-libpostproc-prefix=/usr/local --with-libpostproc-includes=/usr/local/include/postproc --with-libpostproc-libs=/usr/local/lib --enable-libdv --enable-gtk --enable-ogg –enable-libxml2 –enable-lzo –enable-vorbis –enable-freetype2 –enable-a52
Разберем кратко данную команду:
Перед запуском скрипта ./configure мы предварительно сообщаем компилятору, тип оптимизации при сборке и архитектуру нашей системы athlon. Если скрипт не вывел никаких ошибок то можно приступать к сборке, набираем make, затем make install.
Установка GUI интерфейса для transcode dvd::rip
Данная надстройка написана на языке Perl и специально предназначена для удобной работы с кодировщиком transcode. Плюс у нее есть одно неоспоримое преимущество, оно для нас самое важное – это возможность обеспечить кодирование видео в параллельном режиме, здесь используется технология pvm. Поэтому, чтобы иметь возможность кодировать необходимо иметь полностью настроенный и рабочий кластер.
Как видно из рисунка, dvd::rip настроен на использование 3-х машин в кластере, также представлен скриншот окна консоли удаленной бездисковой машины, в котором выведен вывод команды top. В нем представлены процессы выполняющиеся на удаленной машине. Видно что запущен процесс transcode.
Сборка и установка системы перебора паролей cisilia
Проект cisilia был создан с целью провести различные тесты и оценить возможность исследования различных способов перебора паролей методом, т.н. «грубой силы» — bruteforce.
Для этого необходимы высокопроизводительные компьютеры. Это может быть достигнуто с помощью суперкомпьютера или кластера из дешевых компьютеров, соединенных вместе. В настоящее время известно большое количество утилит для подбора паролей (например, l0phtcrack, john the ripper и т.д.), но проект cisilia был специально разработан для работы на кластерах.
Cisilia это мультипроцессная система для перебора паролей для платформы Linux. Последняя версия Cisilia (0.7.3) может «восстанавливать» пароли Windows NT/2000/XP или Samba путем расчета DES/MD4 хэшей. Несмотря на наличие возможности атаки по словарю, задача Cisilia заключается в том, чтобы подобрать пароль путем параллельного брутфорса. Вот почему данное приложение было написано как многопроцессная система для многопроцессорных систем (SMP), и параллельных кластерных систем с функцией балансировки нагрузки (например: openMosix).
Процесс установки не вызывает особых сложностей. Скачиваем исходные тексты или rpm-пакеты с сайта разработчика http://www.citefa.gov.ar
Затем, если решили собирать из исходников, то команды стандартные:
tar -xzvf cisilia-0.7.3.tar.gz
cd cisilia-version
./configure
make & make install
Если решено производить установку из rpm-пакетов, то последовательность команд следующая:
rpm –ihv cisilia-<version>.i386.rpm
rpm –ihv xisilia-<version>.i386.rpm
Также доступен пакет для gui-интерфейса для пользователя xisilia, он устанавливается аналогичным образом.