Денис Колисниченко
Тема данной статьи - параллельные вычисления в Linux. В этой статье
рассмотрены общие вопросы по организации кластеров, кластерное программное
обеспечение, в частности PVM. В конце статьи вы найдете ссылки на дополнительную
литературу по этому вопросу.
Общие сведения о кластерах
Обычно кластеры используются научно-исследовательскими организациями
для моделирования различного рода задач или проведения сложных расчетов.
Цена суперкомпьютеров является недоступной большинства для организаций
такого рода, поэтому появилась идея собрать свой "суперкомпьютер" из "подручного
материала" - рабочих станций на базе процессоров Intel. Производительность
процессоров производства Intel сейчас практически достигла уровня процессоров
архитектуры RISC (процессоры Intel включая Pentium III используют архитектуру
CISC, а P4 - VLIW).
Конфигурация узлов кластера зависит от задач, которые они будут
выполнять. Если ваша цель - само создание кластера без решения каких-нибудь
важных задач, подойдут и старенькие машины с 486-ым процессором (желательно
DX2 или DX4). Для решения относительно важных задач подойдут компьютеры
с процессорами Pentium II от 400Mhz или Pentium III (от 600Mhz).
Обратите внимание на объем оперативной памяти. В первом случае (486/демонстрация
работы кластера) достаточным будет 16-32MB (желательно). Во втором - минимум
64Мб, рекомендуется 128Мб ОЗУ.
Один компьютер (узел) будет центральным. Желательно, чтобы он был более
мощным, чем остальные узлы кластера. На нем нужно установить более мощный
процессор, в два раза большим объем оперативной памяти, чем на остальных
узлах (минимум 128Мб). Желательно на центральном компьютере использовать
SCSI-диск, но подойдет и ATA133 / 7200 rpm. Лучше поставить быстрый SCSI,
а на узлах вообще отказаться от жесткого диска - так будет дешевле. Все
эти требования - желательные, но не обязательные.
Если вы откажетесь от использования жестких дисков на узлах кластера, операционная
система будет загружаться по сети, но об этом мы поговорим немного позже.
В этом случае вы получите лишь выигрыш во времени: операционную систему
и программное обеспечение нужно будет настраивать только один раз.
Теперь поговорим о сети. Как я уже писал, желательно использовать Fast
Ethernet. Если количество узлов довольно велико (от 20), для уменьшения
коллизий необходимо разбить на отдельные сегменты или использовать для
их соединения коммутатор (swith), а не повторитель (hub).
При использовании Ethernet отказываться от жестких дисков не рекомендуется:
кластер будет работать ужасно медленно, будет возникать огромное число
коллизий.
Собираем свой кластер
Программное обеспечение
Использование PVM
Дополнительная литература
Общие сведения о кластерах
Сначала нужно вообще разобраться что же такое кластер. Как правило,
кластер состоит из узлов (отдельных компьютеров) и объединяющей их сети.
Для построения сети обычно используется технология Fast Ethernet (100Mbit/sec),
но в простейшем случае (например, создание кластера в домашних условиях
или в демонстративных целях) подойдет и один сегмент Ethernet на 10Mbit/sec.
Собираем свой кластер
При использовании многопроцессорных машин объем ОЗУ желательно увеличить
до уровня Nx64Mb, где N - это количество процессоров, то есть по 64Мб на
каждый процессор. Обычно используются двухпроцессорные машины - в этом
случае минимальный объем ОЗУ будет равен 126Мб, а рекомендуемый - 128Мб.
Вполне возможен отказ и от видеоплат при сборке узлов кластера (на
центральном узле видеоплата все-таки будет нужна).
В некоторых случаях имеет смысл разбить сеть на сегменты даже при небольшом
числе узлов (от 8), например, если вы используете Ethernet (10Mbit/sec).
Одним из самых эффективных решений для связи узлов кластера является
использование 1.28GBit-ных коммутаторов Myrinet. Также можно использовать
технологию Gigabit Ethernet.
Программное обеспечение
В качестве операционных систем можно использовать:
Предпочтительнее использовать любую Unix-систему, так как именно эти операционные системы наиболее эффективнее используют сетевые ресурсы. Оптимальным решением является операционная система Linux - она бесплатна и довольно проста в настройке.
Можно использовать любую Linux-систему с версией ядра 2.2.* и выше. Я бы порекомендовал использовать шестую версию Linux RedHat, так как она нетребовательна к системным ресурсам (минимальная конфигурация - 486 33Mhz/8MB RAM/120MB HDD) и в состав дистрибутива входит относительно новое программное обеспечение по сравнению с версией 5.2, которую также можно использовать для построения кластера. Версия ядра, используемая этим дистрибутивом (RH 6), 2.2.5-15.
После установки и настройки (настройки сети) операционной системы нужно
установить специальные компиляторы. Дело в том, что бесплатно распространяемые
компиляторы gcc/g77/egcs не обеспечивают необходимого уровня оптимизации
программ для процессоров Intel (PII, PIII). Рекомендуется использовать
коммерческие компиляторы, например, входящие в проект PGI Workstation.
При использовании Windows NT как операционной системы кластера можно
также выбрать компилятор компании Intel, оптимизированный для платформы
Intel. Ознакомиться с этим компилятором вы можете на сайте http://developer.intel.com.
В первом и во втором случае доступны тестовые версии компиляторов. Shareware-версию пакета PGI вы можете скачать на сайте PGI Group - http://www.pgroup.com/register_home.html . А тестовую (14 дней) версию компилятора Intel можно скачать на сайте Intel.
После установки компиляторов нужно установить среду распределения задач. В этой статье я опишу работу со средой PVM, хотя доступны и другие средства - MPI, Condor.
MPI CHameleon представляет собой реализацию промышленного стандарта
MPI 1.1. MPI CHameleon позволяет программам выполнятся внутри локальной
системы или на сетевом кластере с использованием TCP-соединений.
Среда Condor обеспечивает равномерную нагрузку на кластер путем миграции
процессов между несколькими машинами.
Я выбрал более простой вариант - PVM (Parallel Virtual Machine). PVM
обеспечивает условия для выполнения одной (или нескольких - в большинстве
случаем) задач на нескольких машинах. Другими словами PVM просто распределяет
процессы на узлах кластера также как планировщик заданий операционной системы
распределяет процессорное время для выполнения нескольких задач.
Alliant FX/8
Это дадеко не все архитектуры, которые поддерживает PVM. Список всех
доступных архитектур вы найдете в документации pvm. Интересующие нас (точнее,
доступные нам) архитектуры выделены жирным шрифтом.
Работа с "параллельной машиной" довольно проста. Нужно установить ее
на всех машинах кластера. Мой "кластер" состоял из двух машин класса Pentium
(100 и 150Mhz) с объемом ОЗУ по 32Мб и одной (центральной) Celeron 433
(128Mb). От сетевой загрузки я отказался из-за использование 10Mbit-го
Ethernet'a. К тому же на всех узлах уже были установлены жесткие диски.
На центральном была установлена ОС Linux Mandrake 7, а на вспомогательных
машинах Linux RedHat 6.0 Hedwig. Я не устанавливал каких-нибудь коммерческих
комплиляторов, а использовал те, которые входят в состав дистрибутива.
Перед запуском make установите переменную окружения PVM_ROOT. В этой
переменной окружения нужно указать каталог, в котором находятся каталоги
PVM (например, $HOME/pvm, если вы распаковали архив в свой домашний каталог).
Еще одной важной переменной окружения является PVM_ARCH. В ней содержится
название архитектуры операционной системы. Данная переменная должна устанавливаться
автоматически, но если этого не произошло (как в моем случае), нужно установить
архитектуру самостоятельно. При использовании Linux эта переменная должна
содержать значение LINUX.
Как я уже писал, нужно установить PVM на всех узлах кластера. Вся параллельная
машина состоит из демона pvmd и консоли pvm. Назначение опций запуска демона
можно узнать, выполнив команду man pvmd. На центральной машине нужно запустить
демон pvmd и выполнить команду:
После запуска консоли вы должны увидеть приглашение, которое свидетельствует
о том, что кластер готов к работе:
Листинг 1.
PVM может работать на следующих архитектурах:
ALPHA DEC Alpha/OSF-1
DEC Alpha/OSF-1 / using shared memory
AIX46 IBM/RS6000 / AIX 4.x
ATT AT&T/NCR 3600 под управлением SysVR4
BSD386 80[345]86 под управлением BSDI или BSD386/FreeBSD
CM5 Thinking Machines CM-5
CNVXN Convex using native f.p.
CRAY Cray
I860 Intel RX Hypercube
IPSC2 Intel IPSC/2
LINUX 80[3456]86 под управлением Linux
MASPAR
MIPS
SUN4 Sun 4, 4c, sparc, etc.
SUN4SOL2 Sun 4 под управлением Solaris 2.x
SUNMP Sun 4 / Solaris 2.x
WIN32 PC's под управлением Windows95 bkb NT (Intel, Alpha)
Кстати, PVM может работать и на платформе Windows 9x, но вот этого
не рекомендую делать. Ради интереса я установил PVM для Windows 98. Скорость
работы даже тестовых приложений (не говоря уже о реальных расчетах) была
значительно ниже!!! То, что кластер работает медленнее было видно даже
"невооруженным глазом". Скорее всего, это объясняется неэффективной работой
Windows с сетью. К тому же, довольно часто весь кластер "зависал" даже при выполнении тестовых
задач, которые входят в состав пакета PVM.
Использование PVM
PVM компилируется с помощью привычной тройки команды:
configure; make; make install
pvm
Этим мы запустим консоль, с помощью которой мы будем управлять всем
кластером.
pvm >
Введите команду conf для печати конфигурации кластера. Вы должны увидеть
примерно это:
pvm> conf
conf
1 host, 1 data format
HOST DTID ARCH SPEED DSIG
dhsilabs 40000 LINUX 1000 0x00408841
Из листинга 1 видно, что сейчас наш кластер состоит из одной машины
- центрального узла, который работает под управлением Linux. Теперь самое
время добавить в наш кластер еще два узла. Добавление узлов осуществляется
с помощью команды:
add hostname
После успешного добавления узла в кластер он должен быть отображен
в списке узлов кластера. Теперь уже можно запускать программы, которые
поддерживают PVM. Примеры таких программ вы можете найти в каталоге $PVM_ROOT/bin/$PVM_ARCH/.
В нашем случае это будет каталог /root/pvm/bin/LINUX (я установил pvm в
каталог /root). Для начала запустим самую простую программу - hello. Прежде
чем запустить ее, нужно сделать несколько замечаний:
Более интересной является программа gexample. После запуска нужно ввести два аргумента: n и число процессоров. Не вдаваясь в математические подробности, она рассчитывает сумму от 1 до n и факториал числа n. Второй аргумент определяет количество процессоров, которые будут задействованы в вычислении. В нашем случае второй аргумент равен трем. Просмотреть список всех задач можно с помощью команды ps -a. Эту команду нужно вводить в консоли pvm, а не в консоли операционной системы! Породить задачу можно также с помощью команды spawn, которая подробно рассмотрена ниже. Назначение всех команд консоли pvm представлено в таблице 1.
Таблица 1.
Команда | Описание |
add hostname | Добавляет узел в кластер |
alias | Определяет псевдоним для команды |
conf | Выводит текущую конфигурацию кластера |
delete hostname | Удаляет узел из кластера |
halt | Останавливает кластер (точнее завершает процесс pvmd - узлы при этом не выключаются, а продолжают работать) |
help [command] | Выводит список всех команд или краткую справку по указанной команде |
id | Выводит идентификатор процесса pvm (консоли) |
jobs | Выводит список выполняемых задач |
kill TID (task id) | "Убивает" задачу |
mstat host, tid | Показывает состояние узлов |
ps -a | Выводит список всех задач параллельной машины |
pstat task-tid | Показывает состояние задачи |
quit | Выход из консоли pvm |
reset | Сброс - завершаются все задачи |
setenv | Отображает или устанавливает переменные окружения |
sig signum task | Посылает сигнал задаче |
spawn [opt] a.out | Порождает задачу. Об этой команде мы поговорим подробнее после этой таблицы. |
trace | Устанавливает/отображает маску трассировки событий. Более подробное объяснение вы найдете в документации. |
unalias | Удаляет ранее созданный псевдоним команды |
version | Отображает версию библиотеки libpvm |
В таблице 1 я описал не все команды консоли pvm, обо всех остальных
мы можете прочитать, введя команду man pvm.
Теперь рассмотрим некоторые команды подробнее. Начнем с самой
простой - alias. С ее помощью можно определить псевдонимы для часто используемых
команд, например
alias ? help
Теперь вместо команды help вы можете просто вводить ?
Команда id выводит идентификатор консоли pvm:
id t40001
Команда mstat отображает состояние узла, например:
pvm > mstat dhsilabs dhsilabs ok
Подобно привычной нам команде ps, команда консоли pvm ps -a также используется для отображения всех выполняемых параллельной машиной задач:
pvm > ps -a ps -a HOST TID FLAG 0x COMMAND dhsilabs 40002 4/c hoster dhsilabs 40009 2/f hello
Команда pstat выводит состояние задачи:
pstat 40002 t 40002 run
Вот теперь мы подошли к одной из самых интересных команд - spawn. Данная
команда порождает задачу. С ее помощью можно указать некоторые параметры
задачи, например, узел, на котором она должна выполняться.
spawn [opt] a.out
a.out - любой исполнимый бинарный файл - программа,
которая даже не поддерживает библиотеку libpvm. Для таких программ также можно указать, на какой
машине она будет выполняться. В среде Windows параметр a.out - это exe или com - файл.
Можно указать такие параметры команды spawn:
Таблица 2.
Параметр | Описание |
-(count) | Число задач. По умолчанию - 1. |
-(host) | Определяет узел, на котором будет выполняться задача |
-(ARCH) | Задает архитектуру узлов, на которых будет выполняться задача. |
-? | Включает отладку (debugging) |
-> | Перенаправляет стандартный вывод задачи на консоль |
->file (*) | Перенаправляет стандартный вывод задачи в файл |
->>file (*) | Дописывает стандартный вывод задачи в файл |
На этом я завершаю эту небольшую статью о Linux-кластерах. В следующих статьях мы поговорим о других кластерных проектах, в которых используется операционная система Linux. Список дополнительной литературы вы найдете ниже. Если что-нибудь непонятно, пишите - с удовольствием выслушаю ваши вопросы и комментарии, да и команду man тоже никто не отменял...
Parallel.Ru: Лаборатория Параллельных
Информационных Технологий, НИВЦ МГУ