Привет, Хабр! Сегодня мы снова будем экспериментировать, но уже не с FFmpeg, как до этого, а с твердотельными накопителями. Относительно бенчмарков и их производительности принято считать, что показатель IOPS с разными версиями PCIe интерфейса почти не меняется. Так как в отличие от скорости шины данных этот показатель больше привязан к способности контроллера самого SSD осуществлять определенное количество операций в секунду. 

Убеждение это родилось в среде обычных ПК-пользователей. Однако в силу его повсеместности часто встречается, в том числе, когда речь заходит о моделях предназначенных для дата-центров. И как в очередной раз оказалось, наиболее частое мнение не всегда является верным.

Как вы уже прочли из лида к статье, мы будем мучать бенчмарками SSD-накопитель на материнских платах с разными версиями PCIe-интерфейса под него. На «операционный стол» для тестирования к нам попал Samsung PM9A3 U.2 ёмкостью на 1.92TB. От SSD для привычных потребителей это чудо южно-корейской полупроводниковой промышленности отличается  форматом схожим с привычными всем 2.5 SATA SSD, но отличается форматом разъёма, как от SATA, так и от M.2. По характеристикам при этом аналогичен с M.2. В нашем случае в обоих тестах с 4 линиями PCIe. Находится это чудо у нас в hotswap корзине для U.2 дисков, которая, в свою очередь, подключается к разъёму SlimSAS, либо как во втором нашем тесте через Riser в PCI слоте.

Изначально проводя тесты этого SSD, нас интересовало то, как он себя покажет в различных нагрузках со стеком используемого нами ПО. Только под самый конец проводимых нами тестов мы переставили его в сервер на другой материнской плате, где вместо PCI 3.0 была поддержка 4.0. Никаких изменений от смены версий мы не ожидали, полагая, что, скорее всего, контроллер находится в рамках пропускной способности 3 версии. Однако нас ждал сюрприз.

Подготовка к эксперименту

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

Начнём с объёма. С 1998 года организация, название которой вы забудете сразу же после прочтения (Международная Электротехническая Комиссия(IEC), решила стандартизировать единицы измерений в компьютерной индустрии в целях уменьшения хаоса и запутанности форматов. На практике хаоса стало больше. Так как к путанице с уже существующими единицами присоединилась неразбериха с  “официальными”, добавленными в рамках системы СИ.
Если раньше кратные степени 2 величины, столь привычные информатикам, именовались с использованием десятичных приставок кило(KB), мега(MB) и гига(GB), то теперь предлагалось использовать киби(KiB), миби(MiB), гиби(GiB). Байт при этом не тронули: и там, и там в 1 байте 8 бит (бабийтов, бабайтов или же бэбэев, к счастью, нет).
Производителями накопителей, как правило, используется десятичная форма. Как минимум потому что она банально выглядит большим числом в характеристиках. При конвертации в двоичный в 1 терабайте(TB) будет не 1 тебибайт(TiB), а ~0.9.

Считается это следующим образом: количество бит в 1(TB)/ количество бит 1(TiB).
Для 1(TB) — это 10^12(1,000,000,000,000), а для 1 TiB — это 2^40( 1,099,511,627,776). 

Таким образом, объём SSD в нашем тесте в TiB будет равен 110^121.92/2^40, что в итоге даст ~1.74Tib. Однако на практике и то, и то будут называть терабайтом. Потому что тибибайт звучит, откровенно говоря, так себе. А в обозначениях вовсе встретим зоопарк: и TB, и TiB, и Tb, которые обычно употребляются в контексте компьютерных сетей и обозначают терабиты — третью единицу, которая в 8 раз меньше, чем TiB. Ну и, конечно же, куда без обозначения строчными tb, что не несёт за собой никакой стандартизированной единицы.

Скорость. Тут снова зоопарк, так как подключается уже упомянутый третий игрок — биты(b/s), килобиты(Kb/s), мегабиты(Mb/s) и т.д. в секунду. И как будто этого недостаточно -  зачем-то дополнительно оставляют сокращение от «per». Это можно увидеть в Mbps и и Mbit/s.
В контексте накопителей информации, как правило, используются MB/s, GB/s, либо MBps, где у нас всё по 1000, а не 1024

Так как в одном байте у нас 8 бит, то в случае, если нам потребуется сконвертировать одно в другое, мы просто делим на 8. К примеру, (1000Mb/s)/8 — получаем 0.125MB/s.

Готов поспорить, глаза у вас уже от всего этого замылились — различие в одной единственной букве. Если строчная B(MB) это байты, если прописная b(Mb) это биты. 


IOPS (Input/Output Per Second). Тут, слава богу, вариант обозначения всего один — просто IOPS. Но в плане измерений — это самая хитрая величина, так как напрямую не коррелирует со скоростью шины памяти или ячеек памяти. Показатель IOPS сильнее всего зависит от того, как много накопитель способен выполнять операций ввода-вывода за единицу времени. Что, в первую очередь, зависит от того, с какой скоростью работает контроллер.
Так как имея скорость, условно, 7GB/s один контроллер может выполнить 10 операций, между которыми у него будет задержка в 40ms (миллисекунд), а другой 100 за 10ms, пропускная способность при этом у него также 7GB/s, но IOPS у него будет выше.

Методология тестов

Для обоих тестов и с PCIe 3.0, и 4.0 мы использовали консольную утилиту fio. Подсчёт IOPS в ней осуществляется по следующей формуле: в скрипте [fio/stat.c], функция static void show_ddir_status:

```C
iops = (1000 * (uint64_t)ts->total_io_u[ddir]) / runt; // Умножаем на 1000 для перевода из ms в секунды
```

Общее же количество операций ввода/вывода представляет из себя сумму для двух типов операций — последовательных и случайных и находится всё также в [fio/stat.c], в функции void sum_thread_stats.

Параметры системы для теста

Как уже было упомянуто в самом начале, модель выбранного нами SSD — Samsung PM9A3 U.2 в количестве 4-x штук и объёмом 1.92 TB. Если верить документации от Samsung, у него должны быть следующие характеристики:

Процессор – AMD EPYC 7F72 24 ядра/3.2GHz. Оперативная память — Samsung DDR4 3200MHz 256GB(16x16GB), ещё 2х32GB SSD, но DOM-формата, OS — Proxmox 8.1, VM – Almalinux 9.3 с кастомным ядром 6.1.62-1.el9.x86_64, материнская плата — Supermicro h11ssw-nt..

Параметры второго теста были идентичные. Основное отличие заключалось в том, что слоты PCIe материнской платы были версии 4.0, а не 3.0.
Полные характеристики: Asrock B650D4U, CPU AMD Ryzen 7950X, RAM 128Gb DDR5. Так как тестирование производилось в разное время с большим временным промежутком, прошивка дисков и некоторые параметры тестирования отличаются.

Первый тест

Версия PCIe – 3.0, четыре линии, версия прошивки SSD – GDC5602Q.

  • 1 диск (к сожалению, результаты тестирования диска с --ioengine=libaio после обновления прошивки не сохранились)

```bash
fio --filename=/dev/nvme0n1  --direct=1 --rw=randrw --bs=4k --ioengine=io_uring --iodepth=16 --name=test7 --size=384G --rwmixwrite=30 --runtime=600 
```

DEV

R-IOPS

W-IOPS

BW-R(MiB/s)

BW-W(MiB/s)

R-clat(usec)

W-clat(usec)

nvme0n1

83.8k

35.9k

327

140

166.05

39.94

  • MDADM RAID1 (2 диска)

```bash
MDADM RAID1 (2 disk)
fio --filename=/dev/md127  --direct=1 --rw=randrw --bs=4k --ioengine=libaio --iodepth=16 --name=test5 --size=384G --rwmixwrite=30 --runtime=600
```

DEV

R-IOPS

W-IOPS

BW-R(MiB/s)

BW-W(MiB/s)

R-clat(usec)

W-clat(usec)

MD127

50.7k

21.7k

198

84.9

121.39

422.69

Второй тест

Версия PCIe — 4.0, четыре линии, версия прошивки SSD — GDC7302Q.

  • 1 диск

```bash
fio --filename=/dev/nvme0n1 --direct=1 --rw=randrw --bs=4k --ioengine=libaio --iodepth=16 --name=test --size=500G --rwmixwrite=30 --runtime=120
```

DEV

R-IOPS

W-IOPS

BW-R(MiB/s)

BW-W(MiB/s)

R-clat(usec)

W-clat(usec)

NVME0N1

228k

97.9k

892

383

57.37

23.25

  • MDADM RAID1 (2 диска)

```bash
fio --filename=/dev/md128 --direct=1 --rw=randrw --bs=4k --ioengine=libaio --iodepth=16 --name=test --size=500G --rwmixwrite=30 --runtime=120
```

DEV

R-IOPS

W-IOPS

BW-R(MiB/s)

BW-W(MiB/s)

R-clat(usec)

W-clat(usec)

MD127

179k

76.8k

700

300

64.38

47.17

Рассуждение

Результаты, откровенно говоря, удивительные: SSD на 4.0 версии PCIe значительно превосходит себя же на версии 3.0.
К сожалению, время нас поджимало, так как сервер использованный нами для тестов нужно было вводить в работу. И другие тесты в fio не вошли в пост, потому что проводились с другими параметрами, которые между собой не совсем корректно сравнивать. Но в целом, везде наблюдается значительное преимущество в сторону системы с PCIe 4.0 и более свежей прошивкой. Всё остальное при этом осталось неизменным. Хотя коллективный разум на форумах и в целом утверждает, что столь значительной разницы между разными версиями интерфейса и прошивок быть не должно, но, тем не менее, мы наблюдаем обратное.

Отсюда получаем две гипотезы, которые нам, к сожалению, предвидится проверить только в будущем:

1. Контроллер SSD оказался достаточно быстрым, и на версии PCIe 3.0 он упёрся в его пропускную способность.

2. Более свежая версия прошивки исправила какие-то баги, что замедляли работу SSD.

Выводы

Совершенно точно нужно будет провести повторное тестирование SSD в следующий раз при максимально-одинаковых условиях. Но в целом, эксперимент хорошо показывает то, что общепринятое мнение и характеристики, указанные производителем, — это одно, а самостоятельные тесты — совершенно другое. Ни компоненты, ни программное обеспечение не существуют в вакууме. Их комбинаций и разных версий настолько много, что в разных вариантах в итоге могут получаться совершенно разные результаты. И это при одинаковых параметрах тестов, в одинаковых задачах. А, учитывая, что задачи у всех разные, то заранее говорить о чём-то смысла совсем мало - без проверки никак.
Именно поэтому мы в cdnnow! предпочитаем не только тестировать всё самостоятельно для внутренних задач, но и предоставляем демо-доступ для наших клиентов, чтобы они могли на практике оценить предлагаемые нами услуги для выполнения своих задач. Для этого необходимо оставить заявку на нашем сайте.

Комментарии (5)


  1. Grey83
    02.08.2024 17:09
    +1

    принято считать, что показатель IOPS с разными версиями PCIe интерфейса почти не меняется

    Учитывая то, что у Samsung PM9A3 U.2 заявлена поддержка стандарта PCI-Express 4.0.

    PCI-Express 4.0
    По сравнению со спецификацией PCI Express 3.0 максимальная скорость передачи данных по шине PCI Express удвоена — с 8 до 16 GT/s. Кроме того, уменьшены задержки, улучшена масштабируемость и поддержка виртуализации. Для 4 линий скорость передачи данных составляет 8 Гбайт/с, для 16 линий — 32 Гбайт/с.

    Транзакции в секунду (Т/с) — единица измерения, определяющая количество произведённых операций пересылки данных в секунду в каком-либо канале связи.

    Тогда было бы логично предположить что при использовании совместно с шиной PCI Express 3.0 у SSD снизится IOPS. Вот только почему IOPS снизилась более, чем в 2 раза?

    Хм, EPYC 7F72 поддерживает PCI Express 4.0, а Ryzen 7950X - 5.0. Для чистоты эксперимента нужно было найти материнки поддерживающие один и тот же процессор, но имеющие шины разных версий. Потому что у процев отличаются количеством ядер, объёмами кэшей и частотами (хотя оба должны поддерживать PCI Express 4.0).


  1. FobOrgan
    02.08.2024 17:09
    +3

    Тут тайминги памяти немного и частоту процессора на 200МГц уменьшишь и то сказывается на тестах SSD, на разной винде так же результаты разные, а вы на абсолютно разных платформах отличающихся на 2 поколения гипотезы строите. Причем я так понимаю в одном случае там сервер с ECC, а то и регистровой памятью, а в другом обычная десктопная платформа с DDR5.

    К статье больше бы подошла другая картинка рука-лицо.


  1. Cyber100
    02.08.2024 17:09

    считал, что подобных, у которых "лид статьи", вероятно так же "дед энд, коворкинг, опенспейс, пауэршифтинг/дауншифтинг, тимбилдинг" и т.д. уже не осталось... но нет.


  1. GunterVas
    02.08.2024 17:09

    | принято считать, что показатель IOPS с разными версиями PCIe интерфейса почти не меняется

    iops разительно меняются даже чисто при софтварьном подходе - реальный пример Капитула две OSD на диск, вместо одного неузнаваемо увеличивает число IOPS https://www.youtube.com/watch?v=RKfU5wTdvVQ а вы смену интерфейса игнорируете


  1. NotSlow
    02.08.2024 17:09
    +1

    Как уже верно заметили, сравнивать на совершенно разных процессорах бессмысленно.

    Добавлю еще что даже один и тот же процессор можно програмно заставить быть сонным и ленивым или наоборот максимально бодрым и отзывчивым.

    Прогнал у себя на роутере домашнем быстро пару тестов. Одинаковая система, один и тот же диск, но лишь меняя схему энергосбережения запускаю тесты:

    fio --ioengine=libaio --direct=1 --name=test --size=4G --bs=4k --iodepth=1 --readwrite=randread

    fio --ioengine=libaio --direct=1 --name=test --size=4G --bs=4k --iodepth=4 --readwrite=randread

    powersave

    performance

    Разница в результатах примерно в 2 раза...