Тест производительности файл-сервера
Содержание: назначение, особенности реализации, методика, сборка, запуск, параметры, выдача, другие тесты и ссылки. Описание соответствует версии теста от 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"). (Реализованный нами тест в каком-то смысле является развитием этого нагрузочного теста, созданного А.Лацисом, дополенным средствами оценки производительности).