Балансировка загрузки процессоров для эффективной работы параллельной программы на грид-кластере

Ю. П. Галюк, В. И. Золотарев, В. П. Мемнонов БАЛАНСИРОВКА ЗАГРУЗКИ ПРОЦЕССОРОВ

ДЛЯ ЭФФЕКТИВНОЙ РАБОТЫ ПАРАЛЛЕЛЬНОЙ ПРОГРАММЫ НА ГРИД-КЛАСТЕРЕ

1. Введение. В науке и технике имеется большое число задач, требующих для своего численного моделирования значительных вычислительных ресурсов. С развитием международных систем грид, предоставляющих через Интернет распределенные кластерные ресурсы, эти задачи теперь могут решаться. Но при этом возникают и специфические проблемы. В частности, при работе в таких системах, например в ]Чогс1и§пс1, строго соблюдается правило о снятии задания в случае превышения им первоначально заявленного времени счета. В то же время заявка с большим запасом автоматически увеличивает время ожидания в очереди. Хотя информация о параметрах процессоров для параллельных грид-кластеров сообщается в описании ресурса грид-монитора, тем не менее этого может оказаться недостаточным для подготовки задачи к оптимальному запуску на счет. Производительности отдельных процессоров в параллельных кластерах, как правило, различаются между собой, и некоторые из них могут быть в действительности заметно меньше своих номинальных значений. Эти различия могут также сильнее проявляться в зависимости от специфики выполняемого пользовательского приложения. В этом случае параллельное приложение в точках синхронизации будет терять мно1;о времени на ожидание отстающих процессоров. Последовательное уменьшение подобных потерь будет способствовать решению все более сложных задач на имеющейся технике. Здесь следует отметить, что задача управления параллельными процессами для достижения наибольшей эффективности работы кластера рассматривалась в проекте М^х [1], а также в статьях [2, 3], где предлагается вносить в вычислительные системы специальные архитектурные и аппаратные изменения для ее решения. В системах грид на чужих кластерах такой путь, конечно, невозможен. Поэтому в настоящей работе предлагается решать такую проблему с помощью простых дополнительных алгоритмических процедур, вводимых в пользовательские приложения для автоматической диагностики состояния вычислительного процесса и в случае необходимости перераспределения части нагрузки с опасно медлительных процессоров на самые быстрые.

Статья организована следующим образом. В п. 2 рассматривается автоматическая балансировка нагрузки процессоров, причем сначала описывается специальный способ мониторинга вычислительного процесса, затем представлен алгоритм динамической балансировки нагрузок процессоров на самом начальном этапе вычислений и далее описывается алгоритм балансировки процессорных нагрузок уже в процессе всего счета. В п. 3 представлены экспериментальные результаты работы этих алгоритмов на гетерогенном кластере; заключение приводится в п. 4.

2. Автоматическая балансировка нагрузки процессоров. Для автоматической балансировки нагрузки процессоров в настоящей работе используются записи в файл, а затем считывание информации из него. Такой обмен с дисковой памятью при скорости вращения винчестера порядка 10 000 об./мин приводит к дополнительной временной затрате порядка нескольких миллисекунд. Чтобы такие накладные расходы

© Ю. П. Галюк, В. И. Золотарев, В. П. Мемнонов, 2007

не слишком влияли на процесс мониторинга вычислении, временные интервалы всех применяемых процедур должны быть ограничены снизу, например не меньше 0,1 с. Как правило, это условие нетрудно соблюсти. В частности, в наших прежних работах по повышению отказоустойчивости при использовании метакомпьютинга для распределенных вычислений подобные сигнальные файлы уже с успехом применялись для организации коммуникаций [4-6].

2.1. Специальный способ мониторинга вычислительного процесса. С технической стороны важной особенностью принятого подхода является использование встроенной функции компилятора hostNm(name), с помощью которой каждый процесс узнает имя хоста, на котором он запущен. Затем он открывает файл, поименованный этим именем и своим значением тугапк, вписывает в него времена прохождения последовательных участков программных вычислений, выполняет по ним оценку собственной текущей производительности, а с ее помощью и прогноз-оценку времени выполнения своего полного задания. Эти данные используются затем для диагностики и процедур динамической балансировки уже с помощью специальных сигнальных файлов, с которыми работают и другие процессоры кластера. Потому все рабочие файлы должны быть смонтированы в одной директории, например, с помощью NFS для удобного доступа к ним. Приведем примеры информации, получаемой таким способом. На рис. 1 представлено время t выполнения одинаковых заданий отдельными процессорами, используемыми в работе параллельного приложения. Оно сравнивается с временем окончания всей его работы. Очевидно, что появление хотя бы одного медленного узла в кластере приводит к существенному увеличению времени работы из-за непроизводительного ожидания окончания работы этого узла другими перед заключительной статистической обработкой всех результатов, которая в данном случае является точкой синхронизации. И есть смысл уже в начале счета проверить наличие такой гетерогенности и затем перераспределить нагрузку динамически. Такая процедура особенно важна при работе в Grid, где затруднительно получать достаточно подробную информацию о производительности процессоров для выполнения статической балансировки перед началом работы.

г, с

U с

1400 1200 1000 800 600 400

0 2 4 6 8 10

Рис. 1. Время і выполнения одинаковых заданий процессорами (вертикальные линии).

Все время работы - горизонтальная линия.

Рис. 2. Последовательные времена 2 окончания 15 реализаций тремя разными процессорами.

Негативное влияние на скорость выполнения параллельного приложения оказывает

и изменение производительности процессоров параллельного кластера в процессе счета, увеличивая время взаимного ожидания около точек синхронизации. Например, при применении статистических методов необходимо набирать много независимых реализаций с целью увеличения статистической выборки и на каждом процессоре выполняется сравнительно много таких реализаций. На рис. 2 представлены времена t окончания 15 последовательных реализаций на разных процессорах, выполняющих параллельное приложение. Как видно, существенной особенностью этих кривых являются их значительные колебания, отражающие соответствующие изменения во времени производительности процессоров, называемые в дальнейшем флуктуациями.

2.2. Автоматическая балансировка вычислений на начальном этапе. Для снижения неблагоприятного воздействия возможных различий в производительности процессоров параллельного кластера, неизвестных первоначально пользователю, полезно делать ее оценку на начальном интервале вычислений tl, а затем перераспределять нагрузки пропорционально их реальной производительности для выравнивания прихода в точки синхронизации. Это достигается с помощью следующей алгоритмической процедуры.

Алгоритм 1. Уточнение заданий для процессоров на начальном этапе.

1. Начальная установка. При заявленном времени всей работы tf выбирается значение tl так, чтобы выполнялось условие tl << tf. Суммарная вычислительная работа Z сначала распределяется равномерно по процессорам.

2. Производятся вычисления в течение tl при параметре К = 0, входящем в условие перехода к этому алгоритму в программе. Каждый процессор успевает выполнить работу xi, показывая производительность vi = xi/tl и после выполнения условия t > tl посылает на процессор root с помощью операции MPI — REDUCE свои значения vi и xi. Переход на шаг 3.

3. Процессор root в результате получает суммарные величины выполненной уже работы SX = Exi и производительности SV = Evi, вычисляет оставшуюся часть всей работы Y — Z — SX и время t2 = Y/SV, за которое она может быть сделана, а затем с помощью операции MPI — BCAST рассылает это значение t2 на все процессоры. Переход на шаг 4.

4. Получив значение t2, каждый процессор сам вычисляет себе новое реалистическое задание yi = t2xvi и при К = 2 принимается за работу, окончание которой будет происходить для него после выполнения этого задания yi.

Работу данного алгоритма иллюстрирует рис. 3.

2.3. Динамическая балансировка загрузки процессоров. Неблагоприятное воздействие на выполнение параллельного приложения изменений производительностей процессоров в процессе счета может быть снижено с помощью динамической балансировки их нагрузки. Она достигается тем, что во время работы каждый процессор через определенные интервалы вычисляет свою скорость vi прохождения некоторого участка программы и остающийся объем работы Ixi, а также оценивает свое время гг прохождения очередной точки синхронизации. Если время тг оказывается чрезмерно велико и может привести к критическому нарушению графика работы, то он открывает специальный сигнальный файл и записывает в него эти параметры, а также свое значение параметра myrank, на основании которых можно оценить объем необходимой помощи для него со стороны более быстрых процессоров и адрес процессора-получателя. Появление таких файлов как раз и служит диагностическим сигналом о неблагополучном состоянии вычислительного процесса. Для исправления этой ситуации каждый более быстрый процессор при подходе к точке синхронизации не останав-

Рис. 3. Блок-схема алгоритма 1 балансировки загрузки процессоров на начальном этане.

ливается и пассивном ожидании других, а в первую очередь проверяет, нет ли таких сигнальных файлов. И при обнаружении их открывает один и, сравнивая имеющиеся в нем параметры со своими, либо берет часть оставшейся работы медленного процессора на себя, а потом уничтожает этот сигнальный файл, либо просто закрывает его и, не будучи в состоянии сделать всю необходимую работу для помощи самостоятельно, оставляет дополнительную работу другим быстрым процессорам. Новое облегченное задание медленному процессору J он записывает в специальный файл помощи АШ.7, наличие которого тот проверяет и использует для уменьшения своего задания. Так выполняется динамическая балансировка загрузки процессоров. Эта схема была реализована на примере решения задачи о расчете вращательной релаксации молекул методом прямого статистического моделирования Монте-Карло на параллельном МРІ-кластере. Динамическая балансировка загрузки процессоров реализуется с помощью алгоритма 2.

Алгоритм 2. Динамическая балансировка загрузки процессоров.

1. Во время работы каждый процессор, измеряя время прохождения фиксированного участка кода, определяет свою текущую производительность м, вычисляет остающийся объем работы Іхі и оценивает свое время ті прохождения очередной точки синхронизации Те.

2. Проверка превышения установленного порога 5т возможного опоздания. Если ті — Те ^ 5т, то переход на шаг 3, иначе - переход на шаг 4.

3. Открывает специальный сигнальный файл SOS.fi и записывает в него свои параметры Іхі и ш, а также свое значение параметра ц = тпугапк. Переход на шаг 5.

4. Продолжение вычислений и уничтожение своего файла 505, если он возник на предыдущем шаге из-за флуктуации производительности. Переход на шаг 7.

5. Проверка наличия файла помощи AID.fi: НЕТ - переход на шаг 7, ДА - переход на шаг 6.

6. Изменение задания на облегченное с учетом помощи в AID.fi. Переход на шаг 7.

7. Проверка выполнения задания: НЕТ - переход на шаг 8, ДА - переход на шаг 9.

8. Переход на шаг 1 для продолжения вычислений.

9. Поиск файлов 505 опаздывающих процессоров: НЕТ - завершение работы и возврат в главную программу, ДА - переход на шаг 10.

10. Открытие обнаруженного файла SOS.I, оценка помощи процессору I, открытие файла AID.I и запись туда уменьшенного задания для него. Переход на шаг 1 для выполнения вычислений в счет помощи процессору I.

Работа этого алгоритма иллюстрируется на рис. 4.

Рис. 4 Блок-схема алгоритма 2 динамического перераспределения загрузки процессоров в течение всего процесса вычислений.

Замечание. Следует отметить, что открытие файлов SOS.fi для записи параметров, необходимых для оценки объема помощи, и считывание из файла AID.fi нового уменьшенного задания медленным процессором происходят в конце итерации цикла, поэтому не возникает каких-либо помех текущим вычислениям. Очень важно так же и то, что последствия всегда имеющихся кратковременных флуктуаций производи-

телыюсти процессора в случае, когда они приводят к открытию файла SOS.fi, при восстановлении ее значений эффективно уничтожаются в алгоритме в левой его ветви просто закрытием этого файла самим процессором на последующей итерации. Если бы алгоритм для такой цели строился с помощью какого-либо опроса, используя MPI-функции, то этого бы не удалось достичь так просто. Другое полезное свойство алгоритма состоит в том, что обмен информацией между процессорами необходим только для тех из них, которые непосредственно участвуют в балансировке. Соответственно коммуникационная стоимость алгоритма невелика.

3. Результаты работы алгоритмов. Эффективность работы вышеприведенных алгоритмов проверялась при решении задачи о расчете вращательной релаксации молекул методом прямого статистического моделирования Монте-Карло на параллельном MPI-кластере с очень большой разницей в производительности между его процессорами (см. рис. 1). Причем каждый процессор выполнял несколько десятков независимых реализаций, используя разные части последовательности случайных чисел, вырабатываемых своим генератором. В течение процесса вычислений производительность процессоров также весьма сильно менялась (см. рис. 2), возможно, не только вследствие случайного характера исходов в операторах условных переходов программы, но и из-за изменений самой производительности. После выполнения одинаковых заданий процессорами в варианте, когда не применялась балансировка, и разных, меняющихся во времени, при включении алгоритмов балансировки, производился сбор результатов с помощью операции MPI — REDUCE, которая заканчивается только после получения всех отчетов. Затем происходила их обработка на выделенном процессе root. Ниже приводятся результаты этой проверки.

3.1. Результаты работы алгоритма 1. Алгоритм 1 предназначен для выявления на начальном этапе вычислений неоднородности процессоров параллельного кластера по производительности и затем перераспределения их нагрузки в том случае, когда пользователь не имеет возможности сделать статическую балансировку перед запуском задачи на счет. Так может происходить, например, при работе в грид-системах. На рис. 5 сравниваются временные показатели работы данного алгоритма при первоначально заявленном общем времени tf = 2000 с и времени работы самого алгоритма tl = 0, 05 х tf и без его использования, т. е. при одинаковых заданиях на все б процессоров гетерогенного кластера. Сплошные вертикальные отрезки представляют время выполнения одинаковых заданий процессорами, а сплошной горизонтальный отрезок -полное время выполнения задачи. Пунктирные вертикальные отрезки соответствуют времени выполнения разными процессорами своих полных заданий, как одинаковых до tl, так и новых, полученных затем по этому алгоритму. Горизонтальный пунктирный отрезок дает полное время выполнения задачи в данном случае. Как видно, ускорение работы параллельной программы почти трехкратно.

3.2. Результаты работы алгоритма 2. Алгоритм 2 предназначен для динамической балансировки нагрузки процессоров в течение всего времени вычислений па параллельном кластере в условиях существования как статической, так и изменяющейся во времени неоднородности в производительностях его процессоров. На рис. 6 и 7 представлены результаты работы алгоритма 2, характеризующие типичные ситуации для гетерогенных кластеров.

3.2.1. Два медленных процессора вместе с возрастающим числом быстрых при разных способах распределения им вспомогательной работы. На рис. 6 приведены кривые, представляющие полное время t работы отдельных процессоров и всей параллельной программы в зависимости от растущего числа быстрых процессоров пр и

и с

Рис. 5. Время Ь выполнения заданий шестью процессорами по алгоритму 1 и без него.

одном и том же медленном узле (два процессора). Сплошная кривая - это результат работы при одинаковых первоначальных заданиях на каждом процессоре с отключенным алгоритмом балансировки. В этом случае значение Ь в основном определяется производительностью медленных и соответственно весьма велико. Штрихпупктирная кривая соответствует работе с балансировкой, причем для распределения вспомогательной работы принят простейший способ, когда быстрый процессор, закончив свое задание, открывает имеющийся 5'05-файл и пропорционально отношению производительностей, своей и той, которая записана в этом файле, забирает часть оставшегося задания медленного себе для выполнения. Пунктирная кривая соответствует модификации этого способа, в которой быстрый процессор при больших отношениях производительностей забирает только половину, оставляя остальное другим быстрым и обеспечивая тем самым более широкое участие их во вспомогательной работе. Однако при пр = 10 здесь появляется отклонение в сторону увеличения (. Конечно, здесь можно использовать и другие способы перераспределения. Важно отметить только то, что решение задачи уже ускоряется в 3-4 раза.

3.2.2. Гетерогенный кластер: 6 очень быстрых и еще 8 средних и медленных процессоров. На рис. 7 представлены результаты работы алгоритма в условиях гетерогенного кластера, в котором 6 очень быстрых и еще 8 средних и медленных процессоров. В этом случае первоначально запланированное время выполнения всеми процессорами своих одинаковых заданий было выбрано равным 880 с, близким к среднему времени для медленных. На рис. 7 на оси ординат показан прогноз времени tp до окончания задания рассматриваемому процессору или дополнительной работы быстрым в счет помощи, оцениваемое самим процессором в точке на оси абсцисс, на которой откладывается общее текущее время £. Штрихпупктирная кривая - это результат работы процессора, который ни в какой момент не образует 505’-файл и без посторонней помощи заканчивает работу. Рядом с ним проходит граничная прямая остатка запланированного времени </ — £. Пунктиры внизу в виде частых зигзагов - результаты работы двух очень быстрых процессоров. Такой вид их возникает из-за многократной помощи ими всем медленным процессорам этого гетерогенного кластера. И, наконец, пунктирная

Рис. 6. Время работы t в зависимости от Рис. 7. Прогноз времени tp окончания

числа процессоров пр. работы процессором в текущий момент <.

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

4. Заключение. Введение в пользовательские приложения специальных алгоритмических процедур, разработанных в настоящей работе для динамической балансировки загрузки процессоров при вычислениях на параллельных MPI-кластерах, заметно снижает потери в случае их фактической гетерогенности, которая при работе в грид-системах обычно остается неизвестной пользователю. Эта гетерогенность может быть также связана со спецификой конкретного приложения или возникать при изменениях производительности некоторых процессоров уже в процессе счета. Программная реализация данных процедур с помощью специальных сигнальных файлов и NFS обеспечивает эффективное функционирование алгоритма и в условиях кратковременных флуктуаций производительности отдельных процессоров, которые всегда присутствуют. Наконец, очень важно, что сбор информации о темпе работы отдельных процессоров кластера производится ими самыми. Причем эта информация используется для межпроцессорных коммуникаций лишь в случае неблагополучного состояния вычислительного процесса и только между процессорами, непосредственно участвующими в балансировке нагрузки, обеспечивая тем самым сравнительно низкую коммуникационную стоимость алгоритма.

Авторы благодарят О. Н. Граничина за полезное замечание.

Summary

Galyuck Yu. P., Zolotarev V. I., Memnonov V. P. Processor load balancing for parallel program performance enhancement on Grid cluster.

New algorithmic procedures of processor load balancing in parallel cluster are developed for reduction of processor idling time in the case of their performance heterogeneity not known for the user. They could be used for more efficient utilization of contemporary computational resources and especially for Grid computations.

Литература

1. Amar L., Barak A., La’Adah O., Shiloh A. Scalable cluster computing with MOSIX for LINUX // Proc. 5th Annual Linux Expo. Raleigh, NC, May 1999. P. 95-100.

2. Бажанов С. Е., Кутепов В. П., Шестаков Д. А. Язык функционального параллельного программирования и его реализация на кластерных системах // Изв. РАН. Программирование. 2005. Вып. 5. С. 18-51.

3. Котляров Д. В., Кутепов В. П., Осипов М. А. Граф-схемное потоковое параллельное программирование и его реализация на кластерных системах // Изв. РАН. Теория и системы управления. 2005. Вып. 1. С. 75-96.

4. Galyuk Y. P., Memnonov V. P., Zhuravleva S. Е., Zolotarev V. I. Grid Technology with Dynamic Load Balancing for Monte Carlo Simulation // Applied Parallel Computing, PARA’02 /Eds.: J. Fagerholm et al. Lecture Notes in Computer Science, N 2367. Berlin: Springer, 2002. P. 515-520.

5. Галюк Ю. П., Золотарев В. И., Мемнонов В. П. Повышение отказоустойчивости для распределенных вычислений при использовании метакомпьютинга и Grid-технологий // Труды Междунар. конференции «Распределенные вычисления и Грид-технологии в науке и образовании». Дубна: Объед. ин-т ядерн. исследований, 2004. С. 67-73.

6. Галюк Ю. П., Золотарев В. И., Мемнонов В. П. Оптимизация параллельной программы для работы на Grid кластере // Труды второй Междунар. конференции «Распределенные вычисления и Грид-технологии в науке и образовании». Дубна: Объед. ин-т ядерн. исследований, 2006. С. 262-268.

Статья рекомендована к печати членом редколлегии С. В. Чистяковым.

Статья принята к печати 24 мая 2007 г.