На Хабре уже было несколько статей, посвящённых технологии 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 на ВМ. Если кто-то в комментариях сможет это подтвердить или опровергнуть - буду рад.
Буду рад ответить на вопросы.