Мои результаты тестов сравнения быстродействия NVME-over-TCP и NVME-over-RDMA

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

19a3124bca28efc60a80980576ec017d.png

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

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:

b8ec37274c236fadc113eecfe461d61d.png

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

5671bfeab4036f60e5629b00442a39d1.png

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

e3993386dc8ae273b0e6c7b78766c799.png

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

ec48c9c086053fdfefb9bf24cd5b0890.png

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

5c41219e6494590d0b29d95014301486.png

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

5f9fa49eb95c72814624062cda5beba0.png

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

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

© Habrahabr.ru