© Георгиевский Анатолий, 08.11.2005

Опыт развертывания вычислительного кластера на Windows

Задача статьи продемонстрировать процесс установки MPI на Windows. Для внедрения технологий параллельного программирования в программу университета, совершенно необходимо предоставить студентам возможность автономной работы и отладки программ в домашних условиях. Реализация MPICH под Windows в сочетании с компиляторами GNU, позволяет обеспечить пероносимость программ.

Кластеризация всей страны

Если я вижу пару простаивающих компьютеров, я прежде всего придумываю, как объединить их вычислительные ресурсы для распределенного расходывания. Если вижу отдельный компьютер, почему бы не объединить его ресурсы с самим собой.

Собственно всё просто, и если превозмочь лень и почитать хотя бы выборочно документацию по MPICH для Windows, всё становится ясно. MPI - это программный интерфейс для обмена сообщениями между процессами. Модель работы MPI-программы достаточна проста и не превязана к архитектуре вычислительной системы, что и определяет его широкое распространение для создания вычислительных программ.

Почему-то мы ориентируемся на старую версию MPICH, которая уже два года не обновлялась. Мы пока не нашли резона, почему следует использовать MPICH2, за то нашли ряд недостатков, которые определили наш выбор. MPICH2 хочет работать под Windows XP и .NET, а мы этого не хотим.

Установка программного обеспечения

  1. Запустить установку MPICH.nt.1.2.5.exe, программа предложит установить mpd - демона, который задания выполняет, библиотеки и SDK.gcc - всё что нужно для разработки программ с использованием GNU C/C++ и Fortran.
  2. Сервис mpd следует установить на все компьютеры в прямой видимости, хуже не будет. В нашем здании администрирование компьютеров происходит централизованно, мы позаботились, чтобы на всех новых компьютерах демон был установлен.

Есть более простой и эффективный метод установки сервиса запуска MPI - программ на соседские компьютеры:

  1. Установить демона mpd -install, обычно демон живет в папке mpich\bin
  2. Скопировать в папку %WINNT%\system32 два файла mpich.dll и mpichd.dll
  3. Командой net user username password /ADD прописать учетную запись, под которой будут запускаться MPI- программы,

Наших студентов мы ориентируем на использование программного обеспечения Open Source и GNU С/С++. Dev-C++ - это свободно-распространяемая интегрированная среда разработки программ, в основе которой лежит компилятор GNU С/С++ (gcc) и GNU Debugger (gdb). Далее мы будем рассматривать процедуру установки библиотек для поддержки MPI под оболочку Dev-C++. Для тестирования можно взять пример из дистрибутива systest.c. Bloodshed Dev-C++: systest.c

Библиотека mpich.dll используется для динамической сборки приложения. Можно собрать программку со статической библиотекой libmpich.a. Библиотки mpichd.dll и libmpichd.a исользуются для компиляции отладочной версии приложения.
linker: -lws2_32 -lmpich

В разделе "рабочие директории" надо прописать пути для заголовков (..\MPICH\SDK.gcc\include) и библиотек (..\MPICH\SDK.gcc\lib)
dir: ..\MPICH\include

Откомпилировать и запустить сразу несколько процессов, хоть бы и на одном компьютере. Запустить можно из командной строки или из интерфесной программы guiMPIRun.
guiMPIRun

Чтобы запустить процесс на нескольких компьютерах кластера, надо сделать доступным сетевой диск, откуда будет запускаться программа и куда будут данные складываться. Диск надо подключить только на время выполнения программы. Подобные настройки могут быть выполнены в диалоге "Advanced Options".

Если MPI-программа грузится с локального диска каждого компьютера, то встает проблема установки программы на каждый компьютер и синхронизации версий программы на компьютерах кластера. Вопросам синхронизации версий программ и организации совместной работы мы посвятили специальный раздел курса.

Для запуска программ на кластере из нескольких компьютеров под управлением Windows, необходимо чтобы на всех компьютерах был зарегистрирован пользователь, от имени которого запускается процесс и подключается сетевой диск. Учетная запись должна присутствовать на всех компьютерах кластера. Предлагается два варианта решения проблемы раздачи прав доступа.

1: Если кластер доморощенный, до появления злоумышленника можно установить доверительные отношения в группе и прописать единственную общую учетную запись, из-под которой запускаются программы MPI. Дальше каждый участник может организовать доступ для этой учетной записи к своему сетевому ресурсу, папке, откуда запускается его MPI- программа.

2: В условиях университета нам видится удачным решение запускать MPI-программы из персональной сетевой папки, с файлового сервера. У нас эксплуатируется файловый сервер. Каждый студент имеет доступ к своей индивидуальной папке, имеет учетную запись на сервере. Запуск MPI-программы осуществляется из сетевой папки под индивидуальной учетной записью. Поскольку компьютеры учебного кластера входят в домен, учетная запись студента будет присутствовать на каждом компьютере. В ходе установки соединения с сервером, домашняя папка с сервера, автоматически монтируется на H:\.

Замечания по быстродействию

Первый опыт запуска тестовых MPI-программ на кластере, созданном на базе персональных компьютеров под управлением Windows 2000 показал довольно низкое быстродействие сети. Видимо скорость обмена по сетевому интерфейсу занижена искусственно, наблюдается существенная задержка при отсылке коротких сообщений (порядка 1000мкс). Задержка никак не связана с размером пакета или размер пакета не бывает меньше 1,5кБайт. В эксперименте использовались сетевые адаптеры Intel Pro/1000 MT и MPICH.nt-1.2.5.

Для сравнения, кластер на AMD Opteron под Linux на том же сетевом коммутаторе показал задержку 30 мкс при отсылке коротких сообщений. Зависимость от размера пакета наблюдалась начиная с размера сообщения 32-64 байта.

Важным кажется замечание по готовности кластера под Windows, она не высокая. Заранее не ясно, сколько компьютеров сможет принять участие в расчете, требуется средство анализа готовности и загруженности компьютеров. Загрузка программ по сети происходит значительное время, потому что долго происходит подключение сетевого диска. Опять-таки это не связано с быстродействием сети, только с логикой работы Windows. Похоже Windows (использовался Windows 2000 Pro) вообще не умеет проводить одновременную аутентификацию пользователей. За время инициализвации MPI программы аутентификацию успевают пройти не более 7 машин.

Пробовали запускать тестовую MPI-программу на компьютерах под Windows, расположенных в разных зданиях комплекса и разных подсетях. Т.е. при обмене сообщениями по пути следования пакеты подвергались маршрутизации, фильтрации и передаче по цепочке из пяти коммутаторов CISCO. Существенного снижения показателей быстродествия сети не наблюдалось. Время на обмен сообщениями размером 1.5кБайт и больше увеличилось примерно на 10%. В результате можно сделать вывод, что при методичной кластеризации вычислительных ресурсов НОК можно получить беспрецедентную пиковую производительность эквивалентную кластеру из 70-100 вычислительных узлов. Средние показатели быстродействия компьютеров в сети: Celeron2.4G/512MB. Все компьютеры расположены в коммутируемой сети 100Мбит/с и 1000Мб/с, магистральные соединения между коммутаторами имеют пропускную способность 1Гбит/с. С вводом в эксплуатацию оборудования Лабораторного корпуса скорость межсетевого обмена может быть увеличена со 100Мбит/с (25 тыс. пакетов/сек) до 1Гбит/с.

Оптимизация производительности Windows-кластера

При ближайшем рассмотрении выяснилось, что в существенном снижении быстродействия виноват производитель сетевых адаптеров (Intel Pro/1000MT) и Микрософт, который подписался под драйвером с тормозными настройками по умолчанию. Среди настроек сетевого адаптера значится "злонамеренное уменьшение активности", когда адаптер или драйвер вставляет паузы между пакетами и реагирует на активность сети вяло. Настройка параметров адаптера позволила снизить задержку на передачу короткого сообщения между компьютерами Celeron2.66G/512MB до уровня 100мкс.

Задачу быстрой аутентификации пользователей мы решили путем переноса контроллера домена и файловых сервисов на GNU/Linux. Время установления соединения в сравнении с Windows снизилось в несколько раз. Так, запуск MPI-приложения на 20 компьютерах из сетевой папки занимает около трех секунд.

Дальше встала проблема готовности, которая нас не устраивала. На самом деле, не сильно важно, какое количество узлов будет обсчитывать задачу, важно четко знать включен компьютер или нет. А если в компьютерном классе занятия? Важно знать загрузку процессоров. А если после занятия компьютеры выключили? Надо научиться включать и выключать компьютеры удаленно! Совсем уж из области фантастики - миграция процессов между вычислительными узлами кластера могла бы обеспечить защиту от неожиданной активности пользователей и существенно снизила бы вероятность сбоя задания по вине пользователя.

Удаленное включение компьютеров

Задача удаленного включения компьютеров актуальна, когда нет физического доступа к каждому компьютеру распределенного вычислительного кластера. Компьютеры, которые мы намерены использовать для расчетов, располагаются в двух учебных корпусах и равномерно распределены по двум десяткам помещений. Часть этих компьютеров - персональные, и оказываются недоступными для обслуживания. Когда пользователя нет на месте, можно загружать компьютер задачками, но нет физического доступа. Когда пользователь уходит, он, как правило, выключает компьютер.

Практически все встроенные сетевые адаптеры поддерживают такую возможность, Wake On Lan. Задействовать или отключить эту возможность можно в настройках Bios. Если адаптер стоит на шине PCI, он при выключении питания будет выключен. Для поддержки функции WOL необходимо электропитание при "выключенном" копьютере, поэтому сетевые карты часто снабжают дополнительным проводком питания.

Чтобы заставить компьютер включить электропитание, при разрешенной функции WOL, надо отослать адаптеру "Магический пакет". Структура магического пакета содержит шесть байт 0xFF и повторяющийся 16 раз MAC-адрес контроллера. Регламентируется, что пакет может быть широковещательный, причем IP-адрес назначения может быть произвольный, пакет должен быть типа UDP и может приходить на любой порт.

На просторах Интернета можно найти ряд утилит, одна из которых мне понравилась своей лаконичностью, называется wol, распространяется под лицензией GNU GPL. Исходный код утилиты можно найти в проекте http://etherboot.sf.net/. В данном случае проще посмотреть исходные коды, чем искатать объяснения, как все задумано.

Запускать процедуру из другой подсети оказалось невозможно, потому что пакеты широковещательные не доходят. После серии неудачных экспериментов удалось загрузить удаленный компьютер в другом здании, указав явно его адрес. Всё дело в том, что маршрутизатор широковещательные пакеты принимает на свой счет и дальше не передает. Зато маршрутизатор какое-то время хранит ARP таблицу соответствия IP и MAC адресов. Чтобы маршрутизатор не забывал MAC-адреса компьютеров, ему можно прописать статическую ARP таблицу намертво закрепив IP адреса за сетевыми картами. В ФТИ так и сделано, поэтому есть шанс запускать таким образом компьютеры в любое время дня и ночи. Возможно есть другой способ информировать маршрутизатор.

C:\> wol 192.168.1.107-00:07:E9:0F:25:6C 

Судя по коду программы, исходящий пакет udp помечается широковещательным, в шапку приписывается адрес назначения, и пакет отправляется на несуществующий адрес. Пакеты udp не требуют подтверждения со стороны получателя, поэтому всё проходит.

Через минуту компьютер действительно загрузился и стал отвечать на запросы. Утилита, кроме всего прочего, поддерживает пакетные задания, что позволяет загружать таким образом сотню-другую компьютеров по всему миру. Следующим этапом я загрузил одним махом целый класс из 24 компьютеров.

C:\> wol -F=wakeup-cluster.txt

Удаленное выключение компьютеров

Пришлось заглянуть в документацию Windows Platform SDK. Там нашелся пример программного выключения компьютера. Откомпилировали пример, применили mpirun -nompi, компьютеры одним махом вырубились. Исходный код утилиты и загружаемый файл shutdown можно скачть с нашего сайта. Представляю, что будет в здании, если студенты начнут баловаться этой утилитой. Любой непривилегированный пользователь Windows может удаленно выключить компьютер.

Удаленное администирование компьютеров с MPI

Совершенно неожиданно обнаружилася способ удаленного администрирования компьютеров c MPI. Оказывается с равным успехом mpirun позволяет запускать не MPI-программы. Так, если запустить через mpirun командный процессор cmd.exe. Получится терминал для удаленного администрирования. Пример запуска командного процессора:

mpirun -nompi -logon -hosts 1 192.168.1.101 C:\WINNT\system32\cmd.exe

Тем же путем можно запускать svn для синхронизации локальных копий программного обеспечения. Или выполнять компиляцию программ, запуская компилятор из командной строки.

Отслеживане активности кластера

Нам необходимо отслеживать активность каждого отдельного компьютера в кластере под управлением Windows, чтобы принимать решение, можно ли компьютер загружать расчетами. Нужна такая функциональная особенность, компьютер по запросу должен сообщать о своей загрузке. Это можно организовать по протоколу SNMP. В Windows есть встроенное средство, SNMP агент, которое можно дополнительно установить из дистрибутива Windows, из раздела "Добавление и удаление компонент Windows"/"средства управления и наблюдения"/"Протокол SNMP". Настройка параметров SNMP агента осуществляется из раздела "Мой компьютер"/"Управление"/"Службы"/"SNMP агент". Нужно настроить права доступа. Права (RW|RO) - чтение записть или только чтение, раздаются по сообществам (public|private) и IP-адресам. Можно в качестве альтернативного решения, для совместимости с Linux, установить SNMP агента из пакета NET-SNMP.

Среди прочих параметров, которые выдает SNMP-агент, присутствует: hrProcessorLoad - средняя загрузка процессора, hrSWRun, hrSWRunPerf - сведения о загруженных программах. Просмотреть список параметров можно утилитой snmpwalk из пакета NET-SNMP.

В качестве примера, можно наглядно проиллюстрировать опрос компьютеров сети по SNMP протоколу. В нашей реализации опросом копьютеров занимается скрипт на языке PHP с использованием утилит из NET-SNMP. Пример отслеживания загрузки компьютеров по протоколу SNMP

()