Содержание: назначение, особенности реализации, методика, сборка, запуск, параметры, выдача, другие тесты и ссылки. Описание соответствует версии теста от 4 июля 2003 года.


Назначение

NFSTEST/MPI - тест производительности общей файловой системы с точки зрения параллельных MPI-программ. Тест также может использоваться для проверки корректности функционирования файл-сервера при больших нагрузках.

Тест свободно доступен в рамках системы тестов производительности для параллельных компьютеров, разработанной в НИВЦ МГУ.

Особенности реализации

Данный тест не является тестом производительности MPI, но использует некоторые возможности MPI, такие как: синхронизация (MPI_Barrier) и пересылка данных от головного всем процессам (MPI_Bcast). Требуется доступ на запись к некоторой директории на общем файловом сервере (как правило, NFS), видимой одинаковым образом со всех узлов параллельной ВС (кластера).

Тест реализован в виде одного файла nfstest-mpi.c, снабженного комментариями на русском языке (в кодировке КОИ-8 для UNIX). В процессе работы программы все сообщения на терминал и все результаты выдаются только на английском языке с использованием сокращений, описанных в этом файле.

Методика тестирования

Алгоритм тестирования производительности общего доступа к файл-серверу состоит в следующем. На узлах кластера запускается некоторое количество (np) MPI-процессов. Возможен и "вырожденный" вариант, когда тест запускается на одном узле.

Каждый отдельный тест проводится в два этапа: запись и чтение. Перед и после окончания каждого этапа все процессы синхронизируются.

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

Для целей проверки перед началом записи каждый из процессов заполняет буфер байтами с номером этого процесса (myid). На этапе записи каждый из процессов последовательно записывает на файл-сервер определенное число (n) файлов определенного размера (FS). Таким образом, на файл-сервере создается n*np файлов общего размера TFS = FS*n*np. Измеряется время (WTT), затраченное на проведение операций записи (вместе с закрытием) файлов на всех процессорах. Вычисляется общая пропускная способность файл-сервера на тесте записи как TWT = TFS/WTT.

На этапе чтения каждый из процессов последовательно прочитывает с файл-сервера n ранее записанных файлов размера FS. С целью исключить эффект кэширования, тест реализован так, что все или большинство из этих файлов будут файлами, созданными другими процессорами. Это условие будет невыполнено, только при работе теста на 1 или 2 узлах. Измеряется время (RTT), затраченное на проведение операций чтения всех файлов на всех процессорах. Вычисляется общая пропускная способность файл-сервера на тесте чтения как TRT = TFS/RTT.

Вся процедура тестирования, как правило, состоит из нескольких итераций, в рамках каждой из которых размер файлов (FS) изменяется от наименьшего до наибольшего. После окончания всей процедуры выдается наилучшая достигнутая производительность отдельно на операциях записи и чтения.

Сборка теста

Компиляция и сборка теста производится на хост-компьютере кластера с установленной реализацией MPI, обычно достаточно следующей команды:

	mpicc -o nfstest nfstest-mpi.c

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

Запуск теста

Запуск обычно производится командой:

	mpirun -np <число узлов> nfstest <параметры>

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

В процессе работы теста результаты измеряет и выдает только один процесс (головной, с номером 0). Но перед замером времени производится барьерная синхронизация, поэтому результат относится к выполнению операций В/В всеми процессами.

Возможен запуск теста и на одном узле, в частности, на самом файл-сервере.

Параметры теста

Объяснение значений параметров теста:

  • np (number of processes) - параметр mpirun, число запускаемых процессов;
  • u (unit) - единицы измерения размера файлов; возможные значения b (байты), K (килобайты), M (мегабайты);
  • m (minimum) - начальный (наименьший) размер файла (здесь и далее все размеры указываются в единицах);
  • M (Maximum) - наибольший размер файла;
  • b (buffer) - размер буфера В/В в памяти, он же размер порций, читаемых за одну операцию В/В;
  • s (step) - шаг увеличения размера файла (в случае использования множителя K шаг не используется);
  • K (coeficient) - множитель для увеличения размера файла (обычно используются значения 2 или 10);
  • R (repeat) - число глобальных повторов (итераций) всего теста; может использоваться для более точного получения наилучших результатов
  • f (folder) - директория, в которой будут создаваться тестовые файлы;
  • n (number) - число файлов, записываемых (и читаемых) каждым процессом; по умолчанию, это число равно числу процессов, но может быть установлено большее или меньшее значение;
    Например, при работе одного процесса имеет смысл установить большее значение n, чтобы суммарный объем файлов значительно превышал объем оперативной памяти узла, а если работают много процессов, то имеет смысл установить небольшое фиксированное значение n, чтобы суммарный объем файлов оставался в разумных размерах;
  • S (Space) - квота на суммарный объем файлов, создаваемых всеми процессами;
  • d (direct) - флаг использования "прямых" вызовов функций write/read (по умолчанию, используются функции fwrite/fread);
  • v (verbose) - Флаг выдачи всей сопроводительной информации;
  • c (check correctness) - флаг проверки корректности содержимого буфера при чтении;
  • o (output) - имя файла, в который будут печататься результаты (по умолчанию, результаты печатаются на терминал).

Пример запуска и его объяснение

mpirun -np 4 nfstest n3 uK m256 M1024 b256 K2 f/home/tmp onfstest.res d1 c1 v1 R3 

В данном случае будут запущены четыре MPI-процесса. Каждый из них будет создавать по три файла (т.е. получится, что каждый процесс читает только файлы, созданные другими процессами, что хорошо для "чистоты" тестирования). Единица измерения размера файлов - килобайт (К). Размер файлов будет изменяться от 256Кб до 1024Кб (m256 и M1024), каждый раз будет увеличиваться в два раза (K2). Тестовые файлы будут создаваться в директории /home/tmp, а результаты теста будут печататься в файл nfstest.res в текущей директории. Будет включен режим проверки содержимого (т.е. после каждой операции чтения читающий процесс будет проверять, что в буфере оказались именно такие значения байтов, которые туда записывались). Операции записи и чтения будут выполняться функциями write() и read(). Выдача будет включать не только результаты тестов, но и некоторую сопроводительную информацию. Весь тест целиком будет повторен три раза.

Выдача теста

Объяснение значения чисел, выдаваемых тестом:

  • FS (file size) - размер одного файла в установленных единицах (unit);
  • TFS (total file size) - общий размер всех файлов, создаваемых всеми узлами;
  • WTT/RTT (write/read test time) - общее измеренное время работы теста одного записи или чтения (т.е. время, за которое все процессы записывают или читают все положенные файлы);
  • AWT/ART (average write/read time) - среднее время, за которое процесс записывает или читает один файл;
  • LWR/LRR (local write/read rate) - локальная скорость записи или чтения файлов для одного процесса
  • TWT/TRT (total write/read throughput) - общая достигнутая пропускная способность для файл-сервера на операциях записи или чтения;

Между этими значениями и параметрами теста существуют такие соотношения:

	TFS = FS * n * np
	AWT = WTT / n
	ART = RTT / n
	LWR = (n * FS) / WTT
	LRR = (n * FS) / RTT
	TWT = TFS / WTT
	TRT = TFS / RTT

Вот пример выдачи теста с параметрами, указанными в примере запуска выше:

FILETEST/NFS/MPI of 2003/07/04 is running with following parameters:
        Unit is 1Kb = 1024 bytes
        File size: 256Kb to 1024Kb, buffer size: 256Kb
        Number of processes: 4, number of files: 3, total: 12
        Checking correctness of read buffer.
        Using direct I/O calls (read/write).
        Number of iterations for whole test: 2
        Testing file system: /home/tmp
        Nodes: aqua1-1.the.net aqua1-2.the.net aqua1-3.the.net aqua2-1.the.net

Starting test iteration = 0 for FS = 256Kb.
--- TFS=3072Kb  WTT= 0.1s AWT= 0.0s     LWR=5996.3Kb/s TWR=23985.4Kb/s
--- TFS=3072Kb  RTT= 0.1s ART= 0.0s     LRR=9118.8Kb/s TRR=36475.0Kb/s

Starting test iteration = 0 for FS = 512Kb.
--- TFS=6144Kb  WTT= 0.2s AWT= 0.0s     LWR=6249.4Kb/s TWR=24997.8Kb/s
--- TFS=6144Kb  RTT= 0.2s ART= 0.0s     LRR=10179.9Kb/s TRR=40719.8Kb/s

  ...часть выдачи опущена....

Starting test iteration = 1 for FS = 1024Kb.
--- TFS=12288Kb WTT= 0.5s AWT= 0.0s     LWR=6286.2Kb/s TWR=25144.6Kb/s
--- TFS=12288Kb RTT= 0.3s ART= 0.0s     LRR=10739.9Kb/s TRR=42959.5Kb/s

Testing complete in   3.0 seconds
--- Best writing rate achieved: TWR=25144.6 Kb/s (at TFS=12288Kb)
--- Best reading rate achieved: TRR=43103.2 Kb/s (at TFS=12288Kb)

В заголовке выдается версия теста, потом параметры данного запуска, имена узлов, потом последовательно выдаются результаты для отдельных тестов (для различных значений размера файла на различных итерациях). В конце выдается общее время работы всех итераций теста.

Если опустить флаг "подробной" выдачи (v1), то получим выдачу, включающую только строки с результатами тестов.

--- TFS=3072Kb  WTT= 0.1s AWT= 0.0s     LWR=6073.8Kb/s TWR=24295.1Kb/s
--- TFS=3072Kb  RTT= 0.1s ART= 0.0s     LRR=9151.4Kb/s TRR=36605.4Kb/s

  ...часть выдачи опущена....

--- TFS=12288Kb WTT= 0.5s AWT= 0.0s     LWR=6272.1Kb/s TWR=25088.5Kb/s
--- TFS=12288Kb RTT= 0.3s ART= 0.0s     LRR=10738.4Kb/s TRR=42953.5Kb/s
--- Best writing rate achieved: TWR=25088.5 Kb/s (at TFS=12288Kb)
--- Best reading rate achieved: TRR=43064.4 Kb/s (at TFS=12288Kb)

Таким образом, мы получаем, что наилучшая достигнутая пропускная способность файл-сервера составляет примерно 25 Мб/сек для операций записи и 43 Мб/сек для операций чтения. Оба этих значения достигнуты при суммарном объеме файлов в 12 Мбайт (т.е. наибольшем объеме в данном запуске).

Замечание. Имеет смысл сравнить результаты этого теста с результатами теста NETTEST (для логической топологии "звезда"), при запуске головного процесса этого теста на файл-сервере.

Ссылки, другие тесты

Тест SPEC SFS97.

Тест IOzone.

См. подраздел тесты производительности файловой системы на сервере PARALLEL.RU.

Алексей Лацис. Как построить и использовать суперкомпьютер. Москва, изд-во "Бестселлер", 2003 г. См. раздел 4.3 ("Способы управления ресурсом внешней памяти"), раздел 8.2 ("проблема сетевой перегрузки") и приложение 4 ("нагрузочный тест NFS"). (Реализованный нами тест в каком-то смысле является развитием этого нагрузочного теста, созданного А.Лацисом, дополенным средствами оценки производительности).