Skip to content

Методика тестирования производительности виртуальных дисков

Данная статья рассказывает о методах проверки соответствия производительности виртуального диска выбранной политике хранения.

  1. Каждая дисковая политика имеет ограничения по IOPS (количество операции ввода–вывода в секунду) на 1 гигабайт объема. Например, при размещении VM на сайте дата–центра Авантаж возможно использовать политику SSD Ultra, в рамках которой доступно 10 IOPS на 1 Гб. В соответствии с указанной политикой для диска объемом 400 Гб на VM, где планируется выполнение тестов, будет задан лимит 4000 IOPS. Подробнее...

  2. Кроме ограничений по IOPS, выбранная дисковая политика подразумевает определённый SLA – обеспечение приемлемых показателей производительности при строго обозначенном профиле нагрузки на диск. К таким показателям относятся:

    • отдаваемое в гостевую ОС диском VM гарантированное количество IOPS определённого размера;
    • профиль нагрузки, при котором данное количество IOPS будет обеспечено;
    • время отклика дисковых операций.
    Пример

    Политика SSD Ultra гарантирует, что для диска объёмом 400ГБ:

    • гостевая ОС получит 4000 IOPS при размере одной операции в 32КБ;
    • случайный доступ к данным с соотношением по операции чтения и записи 70% / 30%;
    • время отклика не более 3мс.
  3. Для проверки соответствия производительности диска выбранной политике применяются синтетические генераторы нагрузки, позволяющие строго указать все необходимые параметры теста:

    • FIO (Flexible I/O tester) для гостевых ОС Windows, ОС Linux, macOS;
    • DiskSpd для гостевых ОС Windows, ОС Linux.
  4. Такие генераторы как, например, CrystalDiskMark, не подходят для проведения тестов. Данный инструмент является графической надстройкой для DiskSpd. CrystalDiskMark не позволяет строго описать профиль нагрузки, гарантируемый политикой. Таким образом, любые полученные результаты не будут релевантны. Используемый генератор должен позволять задать потолочное значение IOPS в рамках теста. Это позволит избежать эффекта возрастания времени отклика дисковой подсистемы при попытке "пробить" потолочное значение IOPS, предусмотренное политикой.

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

Работа с FIO

FIO (Flexible I/O) — утилита для тестирования и симуляции различных сценариев ввода-вывода, который позволяет моделировать сложные рабочие нагрузки без необходимости писать отдельные тестовые программы. Утилита гибко настраивается, поддерживает многопоточность и асинхронные операции.

В качестве примера будет рассмотрен запуск теста с использованием созданного файла конфигурации для диска объёмом 400ГБ, управляемого политикой SSD Ultra. Необходимо убедиться, что гостевая ОС может гарантировано получить 4000 IOPS размером блока 32КБ при соотношении случайных операций чтения/записи в пропорции 70/30 с задержкой не более 3мс.

  1. Установите утилиту:

    Windows

    Дистрибутивы доступны по ссылке.

    Linux

    Соберите FIO из исходных кодов или установите готовый пакет, используя пакетный менеджер. Пример для RHEL:

    bash
    sudo yum –y install fio
    macOS

    Перед началом работы установите менеджер пакетов Homebrew:

    bash
    sudo /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

    Установите утилиту FIO с помощью менеджера пакетов:

    bash
    sudo brew install fio

    Пример тестирования производительность чтения/записи:

    bash
    
    fio --name=test --filename=testfile --size=1G --readwrite=randrw --bs=4k
  2. Сформируйте конфигурационный файл fio.ini с описанием всех параметров теста.

Текст конфигурационного файла fio.ini

[global]
# Название теста
description=test
# Рабочая директория. В ней FIO создаст job-файлы заданного размера. Например, если тест запускается для тома F, то:
directory=F\:\
# Размер job-файла. Может варьироваться в зависимости от уровня заполнения диска. Не рекомендуется заполнять диск более, чем на 80%.
size=25g
# Время работы теста в секундах. Рекомендуемая длительность тестирования не менее 5ти минут
runtime=300
time_based
# Выбор библиотеки движка для проведения тестирования. Для Windows указывается windowsaio, для Linux libaio
ioengine=windowsaio
# Процент рандомизации операций ввода-вывода.
percentage_random=100
# Запрет использования кэша
direct=1
# Предполагаемая глубина очереди
iodepth=1
# Количество job-файлов. Может варьироваться, если тесту не хватает мощности для достижения требуемого потолочного значения IOPS
numjobs=4
group_reporting
# Количество и соотношение операций чтения/записи на 1 job-файл. При требуемом потолочном значении в 4000 IOPS при 4х job-файлах, получаем 1000 IOPS на 1 job-файл. Для соотношения чтения/записи 70/30 получаем итоговое значение параметра:
rate_iops=700,300
 
[random]
# Размер блока. Он же размер 1й операции ввода-вывода
bs=32k
# Провести тест в режиме случайного чтения и записи
rw=randrw
  1. Запустите тест FIO, указав конфигурационный файл. При первом запуске FIO сначала сформирует на указанном диске требуемое количество job–файлов заданного объёма, затем произведёт нагрузочное тестирование в течение указанного времени. Повторный запуск теста будет использовать имеющиеся файлы, если их параметры не были изменены в конфигурационном файле.

  2. Результат теста будет записан в таблицу в консольном виде. Далее приведен пример вывода работы утилиты в ОС Windows.
    Получите и интерпретируйте результаты теста:

    Представленные результаты означают, что:

    • Достигнуто требуемое потолочное значение в ~4000 IOPS с соотношением чтения/записи в 70/30: r=2800, w=1201.

    • Получена приемлемая (менее 3мс) средняя задержка для операций:

      • read lat (usec) avg=1011,46, что эквивалентно 1мс;
      • write lat (usec) avg=468,78, что эквивалентно 0,5мс.

    Примечание

    FIO не использует фиксированную размерность для отображения результатов времени отклика, поэтому рекомендуется правильно пересчитывать размерность результатов в миллисекунды.

Работа с DiskSpD

DiskSpD (Disk Speed) — это утилита для тестирования производительности дисков. Утилита используется для измерения скорости чтения и записи на дисках, а также для оценки производительности подсистемы хранения данных.

В качестве примера будет рассмотрен запуск теста для диска объёмом 400ГБ, управляемого политикой SSD Ultra. Необходимо убедиться, что гостевая ОС может гарантированно получить 4000 IOPS размером блока 32КБ при соотношении случайных операций чтения/записи в пропорции 70/30 с задержкой не более 3мс.

Примечание

DiskSPD использует фиксированную размерность для отображения результатов времени отклика – миллисекунды.

Windows

  1. Загрузите и установите текущую версию DiskSpD для гостевой ОС. Актуальный дистрибутив доступен в разделе Releases.

  2. Запустите тестовый DiskSpD:

    
    diskspd.exe –Sh –o1 –t1 –L –d300 –w30 –c50G –b32k –rs100 –g2000i F:\diskspd0.tmp F:\diskspd1.tmp
    Описание параметров
    ПараметрКомментарий
    –ShОтключение кэширования запросов I/O
    –o1Глубина очереди
    –t1Количество потоков на один таргет
    –LПроизвести замер показателей задержки
    –d300Время работы теста в секундах. Рекомендуемая длительность тестирования не менее пяти минут
    –w30Процентное соотношение операций записи, из соотношения 70/30
    –c50GРазмер таргет–файла. Может варьироваться в зависимости от уровня заполнения диска. Не рекомендуется заполнять диск более, чем на 80%
    –b32kРазмер блока, он же размер операции IO, равный 32КБ
    –rs100Процент рандомизации операций ввода–вывода
    –g2000iКоличество операций чтения/записи на 1 таргет–файл. При требуемом потолочном значении в 4000 IOPS при 2х таргет–файлах, получаем 2000 IOPS на 1 таргет–файл
    F:\diskspd0.tmp, F:\diskspd1.tmpТаргет–файлы в рабочей директории. В примере используется том F. Количество таргет–файлов может варьироваться, если тесту не хватает мощности для достижения требуемого потолочного значения IOPS
  3. При первом запуске DiskSPD сначала сформирует на указанном диске требуемое количество таргет–файлов заданного объёма, затем произведёт нагрузочное тестирование в течение указанного времени. Повторный запуск теста при изменении параметров потребует ручное удаление существующих таргет–файлов.

  4. Получите и интерпретируйте результаты теста:

    Представленные результаты означают, что:

    • Достигнуто требуемое потолочное значение в ~4000 IOPS с соотношением чтения/записи в 70/30:
      • Total IO ~4044
      • Read IO ~2833
      • Write IO ~1211
    • Получена приемлемая суммарная (менее 3мс) средняя задержка для операций: AvgLat ~0,356.

Linux

Для ОС семейства Linux используется портированная версия DiskSpD.

  1. Убедитесь, что у вас установлены зависимости cmake и make для сборки программного обеспечения:
bash
     sudo apt-get update
sudo apt-get install cmake make g++
  1. Скачайте исходный код портированной версии DiskSpD для Linux:
bash
     git clone https://github.com/microsoft/diskspd-for-linux.git
cd diskspd-for-linux
mkdir build
cd build
cmake ..
make
  1. Для запуска выполните команду:
bash
     ./diskspd [опции]

Результат теста будет записан в таблицу в консольном виде.

macOS

Для запуска DiskSPD на macOS без использования Docker или Wine можно воспользоваться виртуальной машиной с Windows. Для этого можно установить VirtualBox версии 7 и выше или Parallels.