Тест пропускной способности сети при сложных обменах
Назначение
NETTEST - тест коммуникационной производительности при сложных обменах между несколькими узлами в различных логических топологиях ("звезда", "полный граф", "кольцо"). Тест может использоваться для проверки "выживаемости" сетевого оборудования при пиковых нагрузках и для определения пиковой пропускной способности коммутатора.
Основные понятия
Описанные выше методики тестирования обобщаются для случая нескольких процессов. При этом рассматриваются три логические топологии взаимодействия процессов:
- Звезда (Star), т.е. взаимодействие основного процесса с подчиненными;
- Кольцо (Ring), т.е. взаимодействие каждого процесса со следующим;
- Полный граф (Chaos), т.е. взаимодействие каждого процесса с каждым.
Под логическим каналом будем подразумевать неупорядоченную пару узлов (А,B), которые в данной топологии могут обмениваться сообщениями. Логическая топология полностью определяется множеством задействованных логических каналов.
Для каждой топологии рассматриваются однонаправленные и двунаправленные обмены. По каждому логическому каналу между узлами А и В информация в ходе теста передается в обе стороны: от узла А к узлу B и обратно передается по L байт информации. Однако в случае однонаправленных обменов один из узлов, например В, ждет получения сообщения от А, и только тогда может передавать А свое сообщение. Во втором же случае информация может передаваться в обе стороны одновременно.
Конкретные способы организации пересылок средствами MPI (блокирующие, неблокирующие, и т.д. пересылки) здесь не регламентируются; предполагается, что из всех, соответствующих по семантике данной топологии и способу обменов будет выбран вариант с наименьшими накладными расходами.
Методики тестирования будут описаны ниже.
Пропускная способность для случая нескольких узлов
Пусть для данной топологии задействованы N(P) логических каналов, где P - число узлов. Тогда суммарный объем передаваемой по сети информации есть I = 2LN. Пусть узел i имеет Ni(P) логических связей с другими узлами. Тогда этот узел передает и принимает всего 2LNi(P) байт информации.
Под локальной пропускной способностью R(local) в каждом тесте понимается отношение суммарной длины посланных и принятых на данном узле сообщений к затраченному времени.
Под суммарной пропускной способностью R(total) сети понимается отношение количества всей переданной по сети информации к затраченному времени.
Под средней пропускной способностью R(avg) одного логического канала понимается отношение суммарной пропускной способности к количеству задействованных каналов.
Нас будет в основном интересовать именно эта величина.
Исходя из определений трех логических топологий, нетрудно выписать следующие выражения для величин R(local, total, avg) через число узлов P, длину сообщения L и время T, затраченное на все обмены.
При этом в случае топологии Star рассматривается только основной узел.
Star | Chaos | Ring | |
N(P) | P-1 | P(P-1) | P |
R(local) |
![]() | ![]() | ![]() |
R(total) | ![]() | ![]() | ![]() |
R(avg) | ![]() |
Методика тестирования для двунаправленных обменов
Рассмотрим сначала двунаправленные обмены в произвольной логической
топологии. Опишем действия каждого из узлов.
Пусть данный узел с номером
i имеет Ni(P) соседей.
Для "общения" c каждым из них выделяется 2 буфера - один для передачи,
другой для приема; каждый из буферов - размером
не менее L байт, где L - интересующий нас размер сообщения. Это замечание
относится ко всем тестам.
- Производится синхронизация с помощью MPI_Barrier.
- Измеряется текущее время t0.
- Инициализируется передача L байт информации всем соседям с помощью неблокирующей операции MPI_Isend.
- Затем инициализируется прием L байт информации от всех соседей с помощью неблокирующей операции MPI_Irecv.
- Все эти неблокирующие операции возвращают набор запросов MPI (MPI_Request). Вызов MPI_Waitall позволяет дождаться завершения всех этих запросов.
- Производится барьерная синхронизация.
- Измеряется текущее время t1.
С целью минимизации погрешности эта процедура повторяется несколько раз; величина (t1 - t0), усредненная по всем итерациям, и является интересующим нас временем T. Это замечание также относится ко всем тестам.
Методики тестирования для однонаправленные обменов
Случай однонаправленных обменов удобно рассмотреть для каждой топологии отдельно.
1) Пусть в логической топологии "Звезда" центральным является
узел 0. Действия центрального узла ничем не отличаются от описанных
в выше.
Его соседями являются все остальные узлы.
Каждый из узлов 1,2,...,P-1
использует блокирующую операцию MPI_Recv для приема сообщения от узла 0;
а затем посылает узлу 0 свое сообщение с помошью MPI_Send.
2) Топология "Полный граф".
Каждый узел i имеет P-1 соседей: 0,..., i - 1, i + 1,... P-1.
- Производится синхронизация с помощью MPI_Barrier.
- Измеряется "начальное" время t0.
- Инициализируется передача информации узлам с номерами j, большими i, с помощью неблокирующей операции MPI_Isend.
- Инициализируется прием информации от всех узлов с помощью неблокирующей операции MPI_Irecv.
- В цикле вызывается MPI_Waitany для ожидания завершения одного из запросов на прием. После получения сообщения от произвольного узла с номером j, меньшим i, инициализируется передача этому узлу j ответного сообщения c помощью MPI_Isend.
- Производится барьерная синхронизация.
- Измеряется "конечное" время t1.
3) Топология "Кольцо" хороша тем, что независимо от общего количества
узлов, каждый узел имеет только двух соседей.
Для узла с номером i это узлы с номерами r = (i+1) (mod P) и l = (i-1)(mod P),
называемые соответственно правым и левым соседями для i.
- Производится синхронизация с помощью MPI_Barrier.
- Измеряется "начальное" время t0.
- Инициализируется передача информации "правому" узлу с номером r с помощью неблокирующей операции MPI_Isend.
- Инициализируется прием информации от "левого" узла с номером l с помощью неблокирующей операции MPI_Irecv.
- Вызывается MPI_Waitall для ожидания завершения этих запросов.
- Инициализируется передача информации узлу с номером l с помощью неблокирующей операции MPI_Isend.
- Инициализируется прием информации от узла с номером r с помощью неблокирующей операции MPI_Irecv.
- Вызывается MPI_Waitall для ожидания завершения этих запросов.
- Производится барьерная синхронизация.
- Измеряется "конечное" время t1.
Особенности реализации
Тест реализован в виде нескольких файлов на языке Си. Основной модуль (оболочка теста) содержится в файле nettest.c, необходимые определения и прототипы функций находятся в заголовочном файле nettest.h. а в файлах star.c, chaos.c, ring.c, star2.c, chaos2.c, ring2.c, содержатся тестовые процедуры, которые соответствуют различным способам организации однонаправленных и двунаправленных обменов между несколькими процессорами. В файле env.c содержатся некоторые вспомогательные процедуры, а в заголовочном файле env.h - вспомогательные определения и прототипы.
Сборка теста
Правило для сборки теста с помощью утилиты make описано в файле Makefile. После успешной сборки создается исполняемый файл nettest, который содержит включает в себя различные тестовые процедуры.
Параметры теста
- np (number of processes) - параметр mpirun, число запускаемых процессов;
- u (unit) - единицы измерения длины сообщений; возможные значения: b (байты), K (килобайты), M (мегабайты);
- m (minimum) - начальная (наименьшая) длина сообщения (здесь и далее все размеры указываются в единицах);
- M (Maximum) - наибольшая длина сообщения;
- s (step) - шаг увеличения длины сообщения (в случае использования множителя K шаг не используется);
- K (coeficient) - множитель для увеличения длины сообщения (обычно используются значения 2 или 10);
- R (repeat) - число глобальных повторов (итераций) всего теста;
- T (Times) - число итераций в каждой тестовой процедуре;
- С (Chaos) - флаг включения или отключения тестирования по топологии "полный граф" (по умолчанию, все топологии тестируются);
- P (Print mode) - режим вывода результатов: допустимы значение "average", "total" и "local", которые соответствуют средней пропускной способности канала, общей пропускной способности сети и локальной пропускной способности узла.
- o (output) - имя файла, в который будут печататься результаты (по умолчанию, результаты печатаются на терминал).
Пример запуска:
mpirun -np 4 nettest uK m1 M16 K2 R2 T1000 Ptotal otransfer.dat
В данном случае тест будет запущен на 4 процессорах. В качестве единицы длины сообщения будет выбран Килобайт (uK), длина сообщения будет изменяться в геометрической прогрессии (K2) от 1 до 16 Кбайт (m1 M16). Каждая тестовая процедура будет состоять из 1000 итераций (T1000), а весь тест будет повторен два раза (R2). Результаты будут печататься в файл transfer.dat (otransfer.dat), будут выдаваться значения суммарной пропускной способности сети (Ptotal).
Вот пример выдачи теста с указанными параметрами:
NETTEST/MPI of 2003/07/08 is running with following parameters: Message length unit is 1Kb = 1024 bytes Messages: 1 to 16 units, step 0, multiplier 2 1000 times for each test routine, 2 iterations for whole test Running chaos test with 6 logical links used. Nodes: aqua1-1.the.net aqua1-2.the.net aqua1-3.the.net aqua2-1.the.net Network throughput values in MB/sec Size,K Star Star2 Chaos Chaos2 Ring Ring2 1 8.38 16.44 15.88 23.73 15.08 21.85 2 9.95 20.08 19.04 27.62 20.57 26.95 4 12.83 21.47 22.89 31.83 27.61 33.44 8 14.19 21.41 23.58 34.22 32.71 36.83 16 15.03 21.34 25.19 35.05 36.48 39.59 1 8.35 15.00 15.83 23.79 15.51 21.92 2 10.23 20.08 19.26 27.64 20.48 26.92 4 12.81 21.47 22.19 32.14 27.88 33.46 8 14.15 21.42 23.67 34.17 32.79 36.50 16 15.05 21.23 25.16 35.27 36.66 38.59 MPI Network Test complete in 125.51 sec Best network throughput values in MB/sec Star Star2 Chaos Chaos2 Ring Ring2 15.05 21.47 25.19 35.27 36.66 39.59
Здесь мы видим, что наилучшая пропускная способность сети для 4 процессоров достигается на топологии "кольцо" при двунаправленных обменах и составляет примерно 40 Мбайт/сек.