На Хабре уже было несколько статей, посвящённых технологии NVME over Fabric, которая в последнее время становится всё более поп��лярной для сетевых дисковых подключений. Мы сейчас строим некую новую систему и у меня возникла мысль протестировать и сравнить несколько различных настроек. Возможно, кому-то из коллег будут полезны полученные мной результаты.


Прежде всего - несколько дисклеймеров.

1) Для простоты и быстроты тестов мной использовалась утилита CrystalDiskMark версия 8.0.4. Я заранее согласен со всеми претензиями к этой утилите, она не является самостоятельным точным инструментом измерений. Не надо слишком серьёзно относиться к абсолютным значениям, полученных в моих тестах. Меня интересовали относительные значения, а именно как изменения тех или иных настроек NVME over Fabric подключения при прочих равных условиях улучшают или ухудшают получаемые результаты.

2) Тестовая система была построена в следующей конфигурации:

  • В качестве storage (Target) используется сервер Dell R640 c двухпортовым сетевым адаптером Mellanox ConnectX4-100GB/s Ethernet и 10 NVME дисками Dell Intel P4500 4TB. На сервере в качестве гипервизора установлена ESXi 7.03. На ней установлена виртуальная машина Linux Rocky 9.5 для SDS (Software Defined Storage) на основе Intel SPDK. Сетевой адаптер виртуализирован по технологии SR-IOV и пара виртуальных адаптеров проброшена (Passthrough) как PCI устройство в виртуальную машину. Аналогично проброшены NVME диски.

  • В качестве клиента (Initiator) используется аналогичный Dell R640 сервер также с ESXi 7.03. На ESXi настроены по паре NVME over TCP и NVME over RDMA адаптеров, подключенные к соответствующим аналогичным сетевым адаптерам Mellanox ConnectX4 100GB/s. На портах свича выполнены необходимые настройки для работы ROCE v2. Настройка свича выходит за рамки данной статьи, если кому-то будет интересно, пишите в комментариях.

  • На storage сервер создан disk pool из одиночного NVME диска. Был выбран именно одиночный диск что бы отбросить влияние различных software RAID, которые, к сожалению, не очень хорошо работают с NVME дисками (как это уже неоднократно обсуждалось на хабре). Кэширования на уровне сервера нет. Максимальное паспортное быстродействие диска следующее:

    IOPS read (4 KB blocks)

    645,000

    IOPS write (4 KB blocks)

    62,500

    Sequential read rate

    3.2 GBps

    Sequential write rate

    1.8 GBps

  • На клиенте создан VMFS датастор, и установлена тестовая машина Windows 2019 сервер, к которой через NVME контроллер подключён тестовый виртуальный диск, расположенный на соответствующем датасторе. На этом диске и запускались тесты CrystalDiskMark. Понятно что такая цепочка виртуализаций не позволит получить максимально возможные значения быстродействия, но она очень близка к реально используемым в жизни конфигурациям. Плюс, как мы дальше увидим, часть полученных результатов достаточно близка к паспортным (а некоторые и превосходят, что странно), так что одним из результатов эксперимента можно считать что фактические потери такой цепочки незначительны.

  • Для ускорения прохождения тестов был выбран размер тестового файла 1 GB, поскольку кэша нигде нет и для одиночного NVME диска величина тестового файла практически не ��лияет на результаты быстродействия. Для проверки этих утверждений будет сделан один тест на файл размером 64GB, что явно превосходит любой возможный кэш и на уровне SDS, и на уровне самого диска.

Итак - полученные результаты.

1) Один path NVME over TCP Fixed:

2) Один path NVME over RDMA Fixed:

3) Я решил попробовать включить сразу все 4 возможных пути (2 TCP и 2 RDMA) в режиме Round Robing с предлагаемым VMware по умолчанию переключением между путями каждые 1000 IOPS.

4) По опыту, 1000 IOPS для Round-Robing это много. Перенастраиваем на 1 IOPS. Действительно, стало лучше:

5) Отключаем TCP пути и оставляем только RDMA c тем же 1 IOPS. Только RDMA ещё лучше:

6) Увеличиваем размер тестового файла, что бы убедиться что кэширование где-то по дороге не улучшает результаты:

Думаю что цифры говорят сами за себя, особо расшифровывать нечего. Замечу только что мне непонятно каким образом, но практически все результаты тестов оказались лучше паспортных данных, за исключением случайного чтения. И если последовательные чтение/запись ещё в пределах погрешности измерений, то каким образом случайная запись оказалась в 3 раза лучше чем в спецификации - мне не пока непонятно. Что касается того что случайное чтение в 3 раза ниже чем в спецификации - то мне где-то попадалась информация, что VMware ограничивает быстродействие отдельных виртуальных машин до 200000 IOPS на ВМ. Если кто-то в комментариях сможет это подтвердить или опровергнуть - буду рад.

Буду рад ответить на вопросы.