Руководство пользователя системы X-Com
1. Назначение системы
2. Адаптация прикладной программы
3. Архитектура системы и комплект поставки
3.1 Основные компоненты системы
3.2 Иерархия узлов и серверов
4. Комплект поставки
5. Написание и компиляция прикладной программы
5.1 Серверная часть прикладной программы
5.1.1 API С/С++
5.1.2. File API
5.2 Клиентская (вычислительная) часть прикладной программы
5.2.1 Программно-аппаратные платформы вычислительного модуля прикладной программы
5.2.2 Размещение на сервере вычислительных модулей прикладной программы
5.2.3 Интерфейс взаимодействия клиентской части X-Com с вычислительным модулем прикладной программы
6. Конфигурирование и запуск сервера X-Com
6.1 Файл настроек основного сервера
6.2 Файл настроек промежуточного сервера
6.3 Запуск сервера X-Com
6.4 Мониторинг работы сервера X-Com
7. Конфигурирование и запуск клиентов X-Com
7.1 Клиентская программа X-Com
7.2 Запуск клиентов X-Com в монопольном режиме вручную
7.3 Пакетный запуск клиентов X-Com в монопольном режиме
7.4 Запуск клиентов X-Com в режиме по занятости вручную
7.5 Пакетный запуск клиентов X-Com в режиме по занятости
8. Журнал основного сервера X-Com
9. Тестовые задачи
9.1 Задача 3deq
9.2 Задача txt
9.3 Задача test
1. Назначение системы
Проект X-Com нацелен на создание прозрачной, универсальной распределенной среды, в
которой можно будет решать самые различные прикладные задачи. Создается инструментарий,
который смог бы после незначительной переработки существующей прикладной программы
(возможно, уже параллельной) запускать ее распределенно, контролировать ход выполнения,
балансировать нагрузку между узлами и отображать результат. Важным аспектом системы X-COM
является ее работа через сеть Интернет, что позволяет потенциально использовать все ресурсы,
подключенные к ней. Другой важной особенностью мы считаем возможность использовать узлы
самой различной конфигурации - от кластеров до обычных рабочих станций, работающих под
управлением различных программно-аппаратных платформ.
В Руководстве рассмотрена работа системы X-Com в среде Linux. Особенности
функционирования клиента и сервера X-Com под управлением MS Windows описаны в отдельном документе.
2. Адаптация прикладной программы
Для того, чтобы адаптировать программу для работы в системе X-Com, требуется выделить основные
вычислительные блоки (они будут выполняться на узлах) и серверную часть, которая отвечает
за формирование заданий (примеры прикладных задач и их реализаций в системе X-Com описаны в Руководстве).
Рис 1. Прикладная программа в системе X-Com.
Общий алгоритм реализации и запуска вычислений в X-Com выглядит так:
- Придумайте имя своей программе. Это имя будет использоваться для идентификации задачи в системе X-Com.
- Подумайте, каким образом вычисления будут разбиваться на блоки. Это самый важный шаг алгоритма, так как от способа разбивки задачи на вычислительные блоки зависит эффективность работы системы. Желательно придумать разбивку так, чтобы одна порция данных на типичном узле обрабатывалась от минуты до часа.
- Реализуйте серверную и клиентские части прикладной задачи в соответствии с API X-Com (см раздел "Написание и компиляция прикладной программы").
- Cконфигурируйте и запустите сервер X-Com (см. раздел "Конфигурирование и запуск сервера X-Com")
- Установите и запустите клиентские приложения X-Com на вычислительных узлах (см. "Конфигурирование и запуск клиентов X-Com")
- При необходимости после окончания расчета (окончание работы сервера X-Com), обработайте результаты вычислений.
3. Архитектура системы и комплект поставки
3.1 Основные компоненты системы
Система X-Com реализована по принципам клиент-серверной архитектуры, в которой можно выделить два основных компонента.
Сервер X-Com - центральная часть системы, содержащая серверную часть программы пользователя и отвечающая за:
- разделение исходной задачи на блоки
- распределение заданий
- координацию работ всех узлов
- контроль целостности результата
- сбор результата расчета в единое целое
Узел - любая вычислительная единица (рабочая станция, узел кластера, виртуальная машина), на которой происходит основной расчет прикладной программы. Отдельные блоки вычислительной задачи передаются от сервера на узлы, где происходит расчет, результаты которого передаются обратно на сервер. Узлы отвечают за:
- расчет блоков прикладной задачи
- запрос заданий для расчета от сервера
- передачу результатов расчета на сервер
Все коммуникации между узлами и сервером в X-Com происходят через сеть Интернет. При этом используется только стандартный протокол HTTP (HyperText Transfer Protocol), что позволяет подключать к системе практически любые вычислительные мощности, имеющие доступ в Интернет. Система не требует настройки для работы через прокси-сервер, firewall и другие системы защиты. Данные, передаваемые системой, аналогичны стандартному трафику Интернет.
3.2 Иерархия узлов и серверов
Для организации более эффективных коммуникаций и подключения большего количества узлов система может быть организована в виде произвольного иерархического дерева. Листьями такого дерева всегда будут вычислительные узлы, в корне дерева останется центральный сервер X-Com.
Промежуточные сервера (такие как Сервер-2 на рисунке) с точки зрения центрального сервера выглядят как обычные вычислительные узлы, а с точки зрения нижележащих вычислительных узлов как центральный сервер.
К сожалению, в текущей версии X-Com промежуточные серверы корректно не работают.
4. Комплект поставки
Полный вариант системы X-Com для платформы Linux/Intel имеет следующую структуру:
xcom/gcli/ | клиентская часть X-Com |
xcom/gcli/gc | программа-клиент X-Com |
xcom/gcli/gc-install | скрипт для пакетной инсталляция клиентов X-Com на узлы |
xcom/gcli/gc-run1 | скрипт для пакетного запуска клиентов (один процесс на узел) в монопольном режиме |
xcom/gcli/gc-run2 | скрипт для пакетного запуска клиентов (два процесса на узел) в монопольном режиме |
xcom/gcli/gc-run-cron | скрипт для пакетного запуска клиентов на узлах в режиме по занятости |
xcom/gcli/gcping | служебный скрипт, запускается демоном crond, определяет занятость узла (необходим для работы gc-run-cron) |
xcom/gcli/gc-kill | скрипт для пакетного останова клиентов X-Com |
xcom/gcli/gc-stop-cron | скрипт для пакетного останова клиентов на узлах, работающих в режиме по занятости |
xcom/gcli/gc-clean | скрипт для пакетного удаления временных файлов на узлах |
xcom/gserv/ | сервер X-Com |
xcom/gserv/bin | исполняемые файлы сервера |
xcom/gserv/jre* | Java Runtime Envoronment, XXX - версия JRE |
xcom/gserv/log | пустой каталог, в котором будут сохранятся лог-файлы запуска |
xcom/gserv/logx | пустой каталог, в котором будет сохранятся консольный вывод сервера |
xcom/gserv/gserv | shell-скрипт для запуска сервера X-Com |
xcom/gserv/gserv.ini.* | файлы настройки сервера X-Com для тестовых задач 3deq, txt, test |
xcom/gserv/gserv.ini.proxi | шаблон файла настройки для промежуточного сервера X-Com |
xcom/gserv/format.out | шаблон страницы мониторинга сервера |
xcom/gserv/lib3deq.so | скомпилированная серверная часть тестовой задачи 3deq |
xcom/gserv/libtest.so | скомпилированная серверная часть тестовой задачи test |
xcom/gserv/tmp | временный каталог, в котором сохраняются задания промежуточного сервера |
xcom/tasks/ | прикладные задачи. В данном каталоге содержатся серверные и клиентские части прикладной задачи для всех задействованных в вычислениях платформ |
xcom/tasks/3deq/ | тестовая программа 3deq с использованием C/C++ API (см. Руководство). |
xcom/tasks/3deq/3deq-lin.tar.gz | клиентская часть тестовой задачи 3deq для платформы Linux/Intel |
xcom/tasks/3deq/client/ | исходные коды и скрипты для компиляции прикладной части тестовой задачи 3deq для платформы Linux/Intel |
xcom/tasks/3deq/server/ | исходные коды и скрипты для компиляции серверной части тестовой задачи 3deq для платформы Linux/Intel |
xcom/tasks/3deq/server/include | заголовочные файлы, необходимы для сборки любой программы с X-Com |
xcom/tasks/txt/ | тестовая программа txt с использованием File API (см. Руководство) |
xcom/tasks/txt/client | исходные коды и скрипты для компиляции прикладной части тестовой задачи txt для платформы Linux/Intel |
xcom/tasks/txt/out/ | входные данные и файл outlist |
xcom/tasks/txt/in/ | результаты выполнения программы txt |
xcom/tasks/test/ | тестовая программа test (см. Руководство) |
xcom/tasks/test/client | исходные коды и скрипты для компиляции прикладной части тестовой задачи test |
xcom/tasks/test/server/ | исходные коды и скрипты для компиляции серверной части тестовой задачи test для платформы Linux/Intel |
xcom/tasks/test/in/ | пустой каталог для записи результатов, полученных от клиентов |
xcom/tasks/test/test-*.tar.gz/ | клиентские части задачи test для платформ Linux/Intel, Linux/AMD64 и MS Windows |
5. Написание и компиляция прикладной программы
5.1 Серверная часть прикладной программы
Для оптимизации работы сервера с клиентами, необходимо подобрать размер порции так, чтобы на средней машине порция
считалась не менее 5 минут.
В системе X-Com заложено два интерфейса взаимодействия сервера с прикладной программой:
- API для языков C и C++. Через этот интерфейс можно также использовать другие языки программирования.
- File API. Этот способ взаимодействия X-Com с серверной частью прикладной программы подразумевает размещение исходных порций на файловой системе центрального сервера X-Com. Результаты расчета также складываются в файловую систему основного сервера.
Как из двух этих интерфейсов будет использоваться сервером, определяется в файле настроек сервера gserv.ini (см. раздел "Конфигурирование и запуск сервера X-Com")
5.1.1 API С/С++
Для вызова этого интерфейса серверная часть прикладной программы должна быть скомпилирована в библиотеку lib<TASK>.so (здесь и далее <task> означает имя прикладной задачи), которая должна лежать в каталоге ~/xcom/gserv/.
Для реализации API X-Com, который содержится в файле GServProblemC.h, необходимо определить следующие функции:
void initialize(char *arg) |
Функция инициализации серверной части прикладной программы, на вход подаются аргументы, которые определяются в файле настройки gserv.ini (параметр task_arg). |
long getFirstPortionNumber() |
Данная функция возвращает номер первой порции (это может быть любое целое число). Обычно порции нумеруются с единицы. |
long getLastPortionNumber() |
Данная функции возвращает номер последней порции (любое целое число, большее, либо равное номеру первой порции). Если точно число порции не известно, данная функция должна вернуть ноль. |
int isFinished() |
В случае если точное число порций не известно, данная функция определяет закончены ли вычисления. Она вызывается каждый раз после запроса очередной порции. Если мы точно знаем число вычислительных порция и определили его в предыдущих двух функциях. isFinished() должна всегда возвращать ноль. |
char *getPortion(long n) |
Эта функция запроса порции с номером N. Порция данных представляет собой текстовую строку языка C (null-terminated). |
double getPortionSizeGigaflop(long n) |
Это необязательная функция, которая предсказывает вычислительную сложность порции с номером N. Она используется для оптимизации распределения заданий. Если предсказать вычислительную сложность произвольной порции затруднительно, данная функция может для всех значений возвращать единицу. |
void addPortion(long n,char *data) |
Функция обработки результата расчета порции данных номер N. В нее передается номер готовой порции данных и строка с результатами вычислений. |
Пример реализации серверной части простейшей прикладной программы, которая генерирует 100 вычислительных порций пронумерованных от 1 до 100, а телом вычислительной порции является текстовое представление ее номера:
#include <GServProblemC.h>
#include <stdio.h>
void initialize(char *arg) {
printf("Test task: initialization argument is '%s'.\n",arg);
}
long getFirstPortionNumber() { return 1; }
long getLastPortionNumber() { return 100; }
int isFinished() { return 0; }
char *getPortion(long n) {
char tmp[16];
sprintf(tmp,"N-%ld",n);
printf("Test task: portion number %ld generated. Body='%s'\n",n,tmp);
return tmp;
}
double getPortionSizeGigaflop(long n) { return 1.0; }
void addPortion(long n,char *data) {
printf("Test task: Portion %ld processed. Result='%s'",n,data);
}
Для компиляции библиотеки, которую будет использовать сервер X-Com применяются следующие опции компилятора GnuС++ (предполагается, что задача расположена в ~/xcom/tasks/test/server/test.c, а include-файлы размещены в ~xcom/tasks/test/server/include):
cd ~/xcom/tasks/test/server
gcc -O3 -shared -Iinclude -Iinclude/linux -o ../../../gserv/libtest.so test.c
Необходимые include-файлы в дистрибутиве размещены в подкаталоге тестовой задачи 3deq: xcom/tasks/3deq/server/include. Их нужно скопировать в аналогичный каталог сервера реализуемой задачи.
5.1.2. File API
Этот интерфейс не подразумевает программирования серверной части прикладной программы. Готовые для обработки порции данных размещаются в файловой системе центрального сервера, там же складываются результаты расчетов.
Файлы с исходными порциями, которые требуется обработать, размещаются в каталоге: ~/xcom/tasks/<task>/out. Именоваться эти файлы могут любым образом, а чтобы сервер мог определить какие файлы и в каком порядке передавать на вычислительные узлы используется файл ~/xcom/tasks/<task>/out/outlist, имеющий следующий формат:
<file1> [ <tab> <file1_arg> ] <cr>
<file2> [ <tab> <file2_arg> ] <cr>
…
<fileN> [ <tab> <fileN_arg> ] <cr>
Где
<fileX> |
Имя файла. Путь, если необходимо, указывается, начиная от каталога ~/xcom/tasks/<task>/out/ |
<tab> |
Символ табуляции |
<fileX_arg> |
Необязательный аргумент, его можно использовать, чтобы передавать один и тот же файл, но с разными параметрами |
<cr> |
Символ возврата каретки |
Результат расчета помещается в каталоге ~/xcom/tasks/<task>/in/. Имя файла с результатом расчета имеет вид <fileX> '.' <fileX_arg>, где <fileX> - имя файла исходной порции, а <fileX_arg> - аргумент исходной порции.
5.2 Клиентская (вычислительная) часть прикладной программы
5.2.1 Программно-аппаратные платформы вычислительного модуля прикладной программы
Вне зависимости от того, на какой платформе расположен сервер, вычислительная часть прикладной программы может быть представлена для всех программно-аппаратных платформ, где будут производиться вычисления. Для идентификации программно-аппаратной платформы используется двух символьный код вида "WI". В настоящий момент система поддерживает и автоматически определяет 4 программно-аппаратные платформы:
- LI - операционная система Linux на аппаратной платформе Intel
- LX - операционная система Linux на аппаратной платформе AMD64
- LA - операционная система Linux на аппаратной платформе Alpha
- WI - операционная система Microsoft Windows версий NT4/2000/XP на аппаратной платформе Intel.
Этот код автоматически определяется клиентской частью системы X-Com и передается на сервер, который затем передает на узел нужную версию клиентской части прикладной программы (настройка сервера, где лежит версия прикладной программы для каждой платформы - см. "Конфигурирование и запуск сервера X-Com").
5.2.2 Размещение на сервере вычислительных модулей прикладной программы
Вычислительные модули прикладной программы для каждой из платформ располагаются в каталоге ~/xcom/tasks/<task>/ в архиве формата tar gzip. Имя файла архива может быть любым (о том как сервер выбирает файл с вычислительным модулем прикладной программы для нужной платформы будет рассказано ниже). Мы предлагаем именовать эти архивы так: <task>-LI.tar.gz
5.2.3 Интерфейс взаимодействия клиентской части X-Com c вычислительным модулем прикладной программы
Вычислительный модуль прикладной программы - это обычное приложение, состоящие из произвольного числа исполняемых файлов и файлов данных, с произвольной структурой каталогов. Для передачи этой программе данных очередной порции используется специальный интерфейс, размещенный в файле с именем gctask, который должен находится на первом уровне в архиве. Этот файл представляет собой perl-скрипт, в котором должны быть определены две функции:
sub gcprepare |
Данная функция предназначена для инициализации вычислительного модуля прикладной программы. Она не имеет аргументов и вызывается один раз, сразу после закачки архива с клиентской частью программы пользователя. Функция должна возвращать единицу, если инициализация прошла успешно и ноль, если в процессе инициализации произошли ошибки. |
sub gctask |
Данная функция подготавливает и запускает вычислительную часть прикладной программы. Функция имеет 5 аргументов:
$task |
имя задачи, которая сейчас решается |
$taskarg |
аргумент для текущей порции данных |
$portion |
номер текущей порции данных |
$din |
имя файла с исходными данными (файл находится в текущем каталоге) |
$dout |
имя файла, в который надо записать результат обработки данной порции (файл также должен находится в текущем каталоге) |
Функция должна возвращать единицу, если расчет произведен успешно и ноль, если в процессе расчета произошла ошибка.
|
Ниже приведен файл gctask для реализации простейшей вычислительной задачи (подсчета числа строк, слов и символов в входной порции данных) на платформах LI/LX/LA:
sub gcprepare { return 1; }
sub gctask {
my ($task,$taskarg,$portion,$din,$dout) = @_;
`cat $din | wc > $dout`;
return 1;
}
Предположим, что данный файл размещен в каталоге ~/xcom/tasks/test/client, тогда процедура архивации для него будет выглядеть так:
cd ~/xcom/tasks/test/client
tar cvzf ../test-lin.tar.tz
Архив с вычислительным модулем прикладной программы должен быть расположен в каталоге ~/xcom/tasks/<task>.
Внимание! В текущей версии X-Com имеется ошибка, связанная с некорректной передачей
двоичных данных с результатами вычислений в серверную часть прикладной программы.
Для решения этой проблемы в тех случаях, когда реузльтаты вычислений представляют собой
не ascii-файлы, рекомендуем кодировать файлы результатов на стороне клиента с помощью
утилиты uuencode, а на сервере производить uudecode.
6. Конфигурирование и запуск сервера X-Com
Для конфигурирования сервера X-Com используется файл ~/xcom/gserv/gserv.ini
В дистрибутиве системы поставляются файлы gserv.ini.3deq, gserv.ini.txt и gserv.ini.test c настройками центрального сервера для тестовых задачи 3deq, txt и test, и файл-шаблон gserv.ini.proxi для настройки промежуточного сервера.
6.1 Файл настроек основного сервера
Файл настроек основного сервера X-Com имеет следующий вид:
port=7890 |
порт основного сервера |
home=./ |
домашняя директория основного сервера |
server_name=<SERVER-NAME> |
имя основного сервера |
run_API=<Text|C> |
API прикладной задачи: Text либо C |
task=<task> |
имя прикладной задачи |
task_arg= |
параметры прикладной задачи |
clusters={*} |
список кластеров, через запятую, которым разрешен расчет |
max_portion_life_time=3600 |
максимальное время расчета порции |
min_portion_life_time=60 |
минимальное время расчета порции |
portion_life_time_cf=3.0 |
коэффициент дисперсии времени расчета одной порции |
Если в качестве списка кластеров указано значение {*}, то расчет разрешается любым подключающимся узлам.
6.2 Файл настроек промежуточного сервера
Файл настроек промежуточного сервера X-Com имеет следующий вид:
port=7890 |
порт основного сервера |
home=./ |
домашняя директория основного сервера |
server_name= |
имя промежуточного сервера |
server0= |
имя или IP основного, либо вышестоящего сервера |
server0_port=7890 |
порт основного, либо вышестоящего сервера |
run_API=Server |
флаг, что данный сервер - промежуточный |
task=<task> |
имя прикладной задачи |
task_arg= |
параметры прикладной задачи |
clusters={*} |
список кластеров, через запятую, которым разрешен расчет |
max_portion_life_time=3600 |
максимальное время расчета порции |
min_portion_life_time=60 |
минимальное время расчета порции |
portion_life_time_cf=3.0 |
коэффициент дисперсии времени расчета одной порции |
К сожалению, в текущей версии X-Com промежуточные серверы корректно не работают.
6.3 Запуск сервера X-Com
Запуск сервера X-Com из командной строки осуществляется следующим набором команд:
cd ~/xcom/gserv
./gserv
Для запуска сервера X-Com в фоновом режиме используются команды:
cd ~/xcom/gserv
nohup ./gserv &
Можно определить операции, которые будут выполнены непосредcтвенно
перед запуском сервера и сразу после завершения его работы. Например, это могут быть процедуры подготовки исходных
данных, а по завершению счета - отправка сообщения по e-mail.
Эти операции должны располагаться в shell-скриптах xcom/<task>/server/initilize (инициализация) и
xcom/<task>/server/finalize (где <task> - имя прикладной задачи, указанное в gserv.ini).
Наличие этих файлов необязательно.
Команда gserv имеет необязательный параметр "-l". Запуск
с этим параметром перенаправляет консольный вывод сервера в файл xcom/logx/YYYY-MM-DD hh-mm-ss (подставляется текущая дата и время). Это может быть полезно для отладки приложений.
Скрипт gserv по умолчанию предполагает, что JRE находится в поддиректории jre (как в полном дистрибутиве X-Com). Если это не так (используется иная Java-машина), то
необходимо прописать путь к JRE, изменив соответственно следующую строчку в файле:
JAVA_INSTALL_PATH="`pwd`/jre"
6.4 Мониторинг работы сервера X-Com
Во время работы сервера X-Com можно просматривать общее состояние хода вычислений
с помощью веб-интрефейса, доступного по адресу:
http://xcom.parallel.ru:7456/status
(в качестве хоста и порта нужно указать те, на которых работает сервер).
Полученная страница обновляется автоматически и содержит данные
о количестве посчитанных и оставшихся порций, а также сведения
об узлах, подключенных к серверу (имя хоста, платформа, номер текущей порции, время счета текущей порции, среднее время счета порции на узле).
7. Конфигурирование и запуск клиентов X-Com
7.1 Клиентская программа X-Com
Клиентская программа X-Com находится в ~/xcom/gcli/gc. Формат ее вызова следующий:
gc host[:port] [-id node_id] [-home path] [-tmpdir name] [-http http_prefix] [-no-resends] [-reject-empty] [-- appllication_options]
host:port |
Имя и порт сервера X-Com в формате "xcom.parallel.ru:7456". Обязательный параметр. |
-id node_id |
Имя узла. Это имя используется для идентификации узла, визуализации хода расчета и определяет доступность узла.
Обычно имя узла имеет вид: <Кластер> '.' <Узел>, <Кластер> - это имя группы машин объединенных по некоторому признаку.
Имя кластера используется для управления доступом и для визуализации хода вычислений.
Необязательный параметр. По умолчанию используется "UNA.RND" - это значит "имя хоста - точка - случайное число". Про маски аргументов смотрите ниже. |
-home path |
Директория, в которой будут размещаться прикладные задачи.
Необязательный параметр. По умолчанию используется домашняя директория пользователя, от имени которого запускается клиентское приложение X-Com |
-tmpdir name |
Временный путь. Используется для генерации временных каталогов и файлов. Важно при запуске на одной файловой системе нескольких вычислительных задач.
Необязательный параметр. По умолчанию используется "UNA.RND" - это значит "имя хоста - точка - случайное число". Про маски аргументов смотрите ниже. |
-http http_prefix |
Префикс идентификатора URL. Используется для передачи дополнительных параметров на сервер X-Com, а также интеграции с HTTP сервером Apache, либо аналогичными серверами. Необязательный параметр. |
-no-resends |
Обычно в случае обрыва связи с сервером клиент продолжает попытки
передать результаты последней обработанной порции. Данный флаг запрещает повторную
передачу результатов в случае обрыва. При возобновлении связи с сервером клиент
заново запросит задачу и порцию. |
-reject-empty |
Если клиентское приложение возвращает пустой результат, то наличие
этого флага говорит о том, что такой результат некорректен. При отсутствии
этого флага пустой результат будет передан на сервер. Флаг может быть
полезен для тех прикладных задач, в которых генерация пустой порции
свидетельствует о внутренней ошибке приложения. |
-- appllication_options |
Параметры, отделенные символами --, передаются скрипту gctask на каждом,
клиенте, который может обработать их каким-либо специальным образом. Например,
там может находиться указание пути к файлам данных прикладной задачи. |
Для задания имени узла и имени временного файла можно использовать маски.
В X-Com заложено три идентификатора, которые можно использовать в маске:
- UNA - вместо этой последовательности подставляется имя машины
- RND - эта последовательность заменяется на случайное число
- MPI_ID - номер процесса MPI, используется при работе с системами очередей
7.2 Запуск клиентов X-Com в монопольном режиме вручную
Монопольный режим запуска предполагает, что клиенты запускаются на узлах как обычные приложения, захватывая столько ресурсов, сколько требуют вычислительные модули и допускают настройки ОС на узлах.
Ниже приведены примеры инсталляции, запуска и останова клиентского приложения
X-Com через SSH/SCP:
Инсталляция: |
cd ~/xcom/gcli
ssh user@host "mkdir ~xcom; mkdir ~xcom/gcli"
scp gc user@host:~/xcom/gcli/
|
Запуск: |
ssh user@host "~/xcom/gcli/gc xcom.parallel.ru:7456 UNA RND /tmp > /dev/null &" |
Останов: |
ssh user@host "kill -9 -1" |
7.3 Пакетный запуск клиентов X-Com в монопольном режиме
Для пакетного запуска клиентов X-Com в дистрибутиве заложено 5 shell-скриптов, расположенных в каталоге ~/xcom/gcli. Для работы этих скриптов необходимо, чтобы на узлы, где будут запускаться вычисления, был доступ через команду rsh, при этом не требовался ввод пароля. Все скрипты имеют простой код, который можно легко модифицировать. Для работы всех пакетных скриптов требуется в переменную окружения clst записать через пробел имена хостов, на которых будут запускаться вычисления.
gc-install |
Инсталляция клиентской программы X-Com на узлы.
Пример использования:
export clst="host1 host2 host3 host4"
~/xcom/gcli/gc-install
|
gc-run1 |
Запуск клиентской программы X-Com. Запускается один процесс на узле, все данные размещаются в каталоге /tmp. Скрипт принимает в качестве параметра адрес и порт сервера X-Com в формате "xcom.parallel.ru:7456".
Пример использования:
export clst="host1 host2 host3 host4"
~/xcom/gcli/gc-run1 xcom.parallel.ru:7456
|
gc-run2 |
Запуск клиентской программы X-Com. Запускается два процесса на узле, все данные размещаются в каталоге /tmp. Скрипт принимает в качестве параметра адрес и порт сервера X-Com в формате "xcom.parallel.ru:7456".
Пример использования:
export clst="host1 host2 host3 host4"
~/xcom/gcli/gc-run2 xcom.parallel.ru:7456
|
gc-kill |
Останов клиентов X-Com на узлах. Будьте осторожны с использованием этой команды, она убивает все процессы пользователя, от которого она запускается на узлах, перечисленных в переменной clst.
Пример использования:
export clst="host1 host2 host3 host4"
~/xcom/gcli/gc-kill
|
gc-clean |
Очистка на узлах временного каталога /tmp. Удаляются все файлы пользователя, от имени которого запускается программа.
Пример использования:
export clst="host1 host2 host3 host4"
~/xcom/gcli/gc-clean
|
7.4 Запуск клиентов X-Com в режиме по занятости вручную
Режим по занятости предполагает, что клиентская часть X-Com запускается и выполняет
прикладную задачу только в то время, когда узлы не заняты другой работой. Реализовано
это следующим образом. В список заданий crond ставится скрипт gcping, который запускается
ежеминутно и производит следующие действия:
- если средняя загрузка системы (load average) за последнюю минуту была меньше величины 0.25*число_процессоров
и не было запущенных клиентов X-Com, то клиенты X-Com запускаются в том количестве,
сколько процессоров имеется в системе;
- если средняя загрузка системы превысила величину 0.9+число_процессоров и имеются работающие процессы X-Com,
то эти процессы убиваются;
Скрипт gcping принимает следующие параметры:
gcping <host[:port]> <username> [num_of_procs] [LA_start] [LA_stop]
host[:port] |
Хост и номер порта сервера X-Com (обязательный параметр) |
username |
Имя пользователя, от которого запускаются задания (обязательный параметр) |
num_of_procs |
Число клиентских процессов, которые будут запущены на узле (по умолчанию равно числу процессоров) |
LA_start |
Значение load average, при котором узел считается свободным (по умолчанию равно 0.25*число_процессоров) |
LA_stop |
Значение load average, при котором узел считается занятым (по умолчанию равно 0.9+число_процессоров) |
7.5 Пакетный запуск клиентов X-Com в режиме по занятости
Для работы всех пакетных скриптов требуется в переменную окружения clst записать через пробел имена хостов, на которых будут запускаться вычисления.
gc-run-cron |
Запуск клиентской программы X-Com в режиме по занятости. Используются значения gcping по умолчанию. Скрипт принимает в качестве параметра адрес и порт сервера X-Com в формате "xcom.parallel.ru:7456".
Пример использования:
export clst="host1 host2 host3 host4"
~/xcom/gcli/gc-run-cron xcom.parallel.ru:7456
|
gc-stop-cron |
Очищает список заданий демона cron на узлах. Запуск только
этого скрипта не приводит к остановке уже запущенных клиентских процессов, поэтому для полного завершения вычислений необходимо также запустить скрипт gc-kill.
Пример использования:
export clst="host1 host2 host3 host4"
~/xcom/gcli/gc-stop-cron xcom.parallel.ru:7456
~/xcom/gcli/gc-kill
|
8. Журнал основного сервера X-Com
Результаты работы всей системы записывается в журнал, который находится в каталоге ~/xcom/gserv/log. Для каждого запуска сервера X-Com формируется отдельный файл, имя которого отображает дату время запуска - "2003-05-20 12:23:42.213". Вначале файла журнала идут параметры сервера и запускаемой задачи:
2002-11-24 05:03:00.64 gserv.ini server_name=xcom.parallel.ru
2002-11-24 05:03:00.642 gserv.ini task=genome
2002-11-24 05:03:00.642 gserv.ini task_arg=matrix1
2002-11-24 05:03:00.644 gserv.ini clusters={}
2002-11-24 05:03:00.644 gserv.ini run_API=Text
2002-11-24 05:03:00.657 gserv.ini max_portion_life_time=3600
2002-11-24 05:03:00.658 gserv.ini min_portion_life_time=60
2002-11-24 05:03:00.668 gserv.ini portion_life_time_cf=3.0
2002-11-24 05:03:00.669 gserv.ini port=7456
Затем, следует пустая строка и записи событий (каждая запись в отдельной строке):
2002-11-24 05:03:06.159 192.168.0.4
ASW1:/?sId=f1b35aa79e4&opCode=1&gcCode=node4.1&OS=L&MHz=996.582
Запись состоит из трех боков, разделенных табуляцией. Первый блок - время события, второй - IP адрес хоста, который был инициатором события. В третьем блоке отображается тип события, далее после двоеточия параметры события. Часть параметров является общим, для всех событий:
sId |
Уникальный идентификатор сессии (присваивается автоматически) |
gcCode |
Имя узла X-Com, которое задается в клиентской программе X-Com |
opCode |
Код операции. X-Com поддерживает операции 4-х типов:
1 - отдать порцию данных для обработки
2 - принять результат обработки данных и отдать новую порцию
3 - принять результат обработки данных
4 - запрос на передачу тела прикладной задачи |
OS |
Код платформы, на которой запущена клиентская программа |
MHz |
Частота процессора на котором запущена клиентская программа |
Ниже приведена таблица, раскрывающая различные типы событий и дополнительные параметры, определенные для этих типов.
TSR1 |
Начало передачи тела прикладной задачи на узел. Дополнительных параметров нет. |
TSR2 |
Окончание передачи тела задачи на узел. Дополнительный параметр length содержит размер переданной прикладной программы. |
REQ1 |
Начало передачи очередной порции данных на узел. Дополнительных параметров нет. |
REQ2 |
Окончание передачи порции на узле. Дополнительными параметрами являются length - размер порции и portion - номер переданной порции. |
ASW1 |
Начало приема результата расчета порции от узла. Дополнительным параметром portion - номер порции, результат которой принимается. |
ASW2 |
Окончание приема результата расчета. Дополнительными параметрами являются length - размер принятого результата и time - чистое время расчета на узле. |
9. Тестовые задачи
9.1 Задача 3deq
В системе X-Com содержится программа 3deq (3-d equation). Это решение уравнения вида f(x,y,z) = 0 в некоторой области x1-|Y|3+10Y2-26|B|e-X2 = 0
решением, которого является поверхность вида:
Приблизительно эту задачу можно решить разбивкой осей исходной области на отрезки с некоторым шагом D. Далее мы рассматриваем знаки функции f в точках из области ее определения: (x1+Dn, y1+Dm, z1+Dk) и (x1+Dn, y1+Dm, z1+D(k+1)), если знаки функции в данных точках разные, значит на отрезке между этими двумя точками лежит ноль функции, далее его можно приближенно найти линейной интерполяцией.
Решение задачи с помощью X-Com
Для решения этой задачи с помощью системы X-Com область значений функции разбивается на кубы, каждый из которых передается на свой вычислительный узел. В качестве параметров серверу X-Com задается область решения всего уравнения, шаг D с которым осуществляется перебор и размер передаваемой области на вычислительные узлы. В дистрибутиве заложен следующий набор параметров:
-10 10 -10 10 -10 10 0.1 50
Т.е. мы ищем нули функции в кубе -10<x<10, -10<y<10, -10<z<10 с шагом 0.1. На узлы при этом передается куб, ребро которого равно 5 (0.1 * 50). При таких параметрах задача разбивается на 64 порции по 125000 вызовов функции в каждой.
Запуск задачи 3deq
Для запуска тестовой задачи в режиме, когда сервер и клиент находятся на одном узле, надо выполнить следующий шаги.
Запустите одну консоль для запуска сервера и выполните следующие команды:
cd ~/xcom/gserv
./gserv
После этого в консоли должна появится информация от сервера:
2003-04-28 02:19:58.315 gserv.ini home=./
3deq> portion size (number of function calls): 125000
3deq> number of portions: 64
Далее запустите еще одну консоль (первая с запущенным сервером должна продолжать работать) и выполните команды:
~/xcom/gcli/gc 127.0.0.1:7890
После чего во второй консоли должна появится информация вида:
Operating system: <Linux> (letter='L')
Hardware: <Intel> (letter='I')
Platform code: <LI>
XCom server: host=<127.0.0.1>, port=<7456>
Host name is: <xcom.parallel.ru>
Processor frequency: 1693.784
WARNING: Node ID is not defined. Use <UNA.RND>.
WARNING: Temporary name is not defined. Use <UNA.RND>.
Node id: <xcom.parallel.ru.82252-37018>
Temporary id: <xcom.parallel.ru.82252-37018>
Home directory: </home/maxim>
HTTP prefix: <>
Creating temporary directory for the task: /home/maxim/xcom.parallel.ru.82252-37018
Reading source for the task
session=f4d139e5350
task=3deq
srclen=3427
Creating directory: /home/maxim/xcom.parallel.ru.82252-37018/3deq
Source read.
Unpacking source...
Source ready. Running prepare...
Source test passed
Requesting data for the first time
Doing portion 1...
Done
Posting 1
Doing portion 2...
Done
Posting 2
Doing portion 3...
Done
Posting 3
Если выдача клиентского приложения X-Com соответствует описанию дождитесь завершения работы. При этом сервер завершит свою работу автоматически, а клиентское приложение войдет в цикл, когда будет периодически запрашивать у сервера новую задачу. Т.е. для повторного запуска достаточно просто еще раз запустить сервер X-Com.
Результат расчета лежит в файле ~/xcom/tasks/3deq/result.dat и имеет вид:
-10 -9.9 0
-10 -9.8 0
-10 -9.7 0
Это точки, в которых функция принимает нулевое значение.
Исходные коды и компиляция тестовой задачи
В каталоге xcom/tasks/3deq/client/ расположены исходные коды (3deq-cli.c) и скрипт для компиляции (compile) прикладной части тестовой задачи 3deq для платформы Linux/Intel.
В каталоге xcom/tasks/3deq/server/ расположены исходные коды (3deq-srv.c) и скрипт для компиляции (compile) серверной части тестовой задачи 3deq для платформы Linux/Intel.
Мы думаем, пользователю, знакомому с языком C, не составит труда разобраться в реализации данного примера, поэтому опустим подробное описание реализации.
Освоение системы X-Com с помощью тестовой задачи
Для освоения системы X-Com сначала попробуйте запустить тестовую задачу на нескольких вычислительных узлах вручную и с использованием пакетного режима (см. раздел "Компилирование и запуск клиентов X-Com).
Далее попробуйте использовать другие параметры севера (модифицируйте файл gserv.ini):
-
"
-10 10 -10 10 -10 10 0.1 100 " => 8 порции по 1000000 вызовов функций
-
"
-10 10 -10 10 -10 10 0.01 200 " => 1000 порции по 8000000 вызовов функций
Далее попробуйте модифицировать клиентскую и серверную часть задачи 3deq, откомпилировать задачу и проанализировать результат хода вычислений (см. раздел "Написание и компиляция прикладной программы")
9.2 Задача txt
Задача txt иллюстрирует применение Files API для решения задач, в которых
входные данные уже разбиты на отдельные файлы, и каждому входному файлу
соответствует один выходной файл. В этом случае программирование серверной части задачи не требуется.
Задача txt выполняет команду wc (подсчет числа символов, слов и строк) над всеми файлами, имена которых перечислены в файле xcom/tasks/txt/out/outlist
outlist. Результаты выполнения сохраняются в файлах в директории xcom/tasks/txt/in .
9.3 Задача test
Задача test предназначена для проверки работоспособности
среды метакомпьютинга Х-Com, для имитации реальных вычислений, оценки
нагрузки на различные компоненты среды и т.д. Серверная часть задачи генерирует
"входные данные" заданного размера, клиентская часть принимает эти данные,
производит вычисления и отправляет "выходные данные" серверу. Сервер записывает
полученные от клиентов данные в директорию xcom/tasks/test/in - по одному
файлу на каждую порцию.
Параметры тестовой задачи
Тестовая задача имеет 12 обязательных параметров, отражающих различные варианты
поведения модельной задачи. Напоминаем, входные параметры задачи прописываются в строке task_arg файла gserv.ini .
1) мин. размер исходящих порций ("входные данные"), байт
2) макс. размер исходящих порций, байт
3) изменение размера исх. порций (возможные значения - символы C, R, I или D)
4) мин. размер входящих порций ("результаты"), байт
5) макс. размер входящих порций, байт
6) изменение размера вх. порций (возможные значения - символы C, R, I или D)
7) мин. время счета на узле, сек.
8) макс. время счета на узле, сек.
9) изменение времени счета (возможные значения - символы C, R, I, D или E)
10) размер матрицы для счетного процессорозагружающего модуля задачи
11) выбор счетного модуля (возможные значения - символы N, M, L или U)
12) число порций
Пояснение к параметрам, задающим алгоритм изменения размеров (пп.3,6):
С (Constant) - размер не меняется и равен минимальному
R (Random )- размер изменяется случайным образом в диапазоне между мин. и макс.
I (Increase )- размер равномерно увеличивается от мин. до макс. значения
D (Decrease) размер равномерно уменьшается от макс. до мин. значения
Размеры задаются в байтах.
Для изменения времени счета порции (п.9) все аналогично. Добавляется параметр
E - в этом случае задание не прерывается по истечении определенного
времени, а выполняется до конца. Соответственно, время счета будет
зависеть от выбранного счетного модуля и размера матрицы для него.
Время задается в секундах.
Счетные модули
Задача содержит 3 различных счетных модуля, обеспечивающих загрузку
процессора и резервирование памяти, а также поддерживает режим работы
без загрузки процессора. Счетный модуль указывается 11-м параметром
задачи и может быть одним из следующих:
M (Matrix) - умножение 2-х квадратных матриц заданного размера. Элементы
матрицы (по умолчанию типа int) генерируются случайным образом. Резервируется
память для 3-х матриц.
L (matrix_Light) - умножение матрицы заданного размера самой на себя.
Резервируется память для 1-й матрицы.
U (matrix_Ultralight) - имитация умножения матриц путем выполнения
аналогичного числа арифметических операций над случайными числами.
Память под матрицу не резервируется.
N (None) - никакого счета не производится, выполняется sleep.
Если для изменения времени счета указывается значение, отличное от E,
то счетный модуль по истечении определенного времени прерывает работу.
В противном случае времена счета игнорируются, и модуль отрабатывает до
своего естественного завершения.
В дистрибутиве имеются счетные модули, откомпилированные для 3-х платформ:
Linux/Intel (test-lin.tar.gz ), Linux/AMD64 (test-lin_x86.tar.gz ), Windows/Intel (test-win.tar.gz ).
Пример
# 1 2 3 4 5 6 7 8 9 10 11 12 (комментарий - номера параметров)
task_arg = 20 20 C 40 40 C 1 5 R 1000 M 100
- входные данные по 20 байт на порцию, выходные данные по 40 байт на порцию,
время счет изменяется случайным образом от 1 до 5 секунд, вычислительный
модуль Matrix, размер матриц 1000х1000, 100 вычислительных порций.
|