Производительность софт NVMe рейдов на основе mdadm, LVM и ZFS при использовании iSER и NVMe-oF (100G version) — Part 2

Страницы:  1

Ответить
 

Professor Seleznov


Предисловие скопировано из Part 1.
С момента прошлой статьи прошло 2 года (и за время написания статьи ещё полгода), за это время:
  • количество дисков в системе увеличилось до 8 PM9A3 1.92TB;
  • вышло несколько новых прошивок на PM9A3;
  • сеть обновилась с ConnectX-3 Pro 40G до ConnectX-4 100G;
В связи с этим - было решено заново провести тесты.
У данной статьи такие же две цели, как и у прошлой:
  • Протестировать производительность трёх систем объединения физических устройств в одно логическое, как для локального доступа к нему, так и для использования в качестве блочного массива для виртуализации.
  • Создание бэкэнда для кластера в виде одноконтроллерного хранилища.
Иными словами выводы данной статьи не применимы, когда Вам нужно:
  • Синхронное отказоустойчивое решение
  • Надежность >>> скорость
  • Долговременное решение, которое можно поставить и забыть
0. Оглавление
0) Оглавление
1) Описание тестового стенда
2) Общая настройка серверов
2.1) Особые условия
3) iSER
3.1) Raw Data
3.2) VDbench - 4k - 100% rng - 100% Write
3.3) VDbench - 4k - 100% rng - 100% read
3.4) VDbench - 4k - 80% rng - 50/50 r/w
3.5) VDbench - 64k - 80% rng - 75/25 r/w
3.6) VDbench - 8k - 80% rng - 75/25 r/w
3.7) FIO - 256k - 0% rng - 0/100 r/w
3.8) FIO - 4k - 100% rng - 100/0 r/w
3.9) FIO - 4k - 100% rng - 70/30 r/w
3.10) FIO - 8k - 100% rng 70/30 r/w
3.11) Сравнение софт рейдов
3.11.1) Raid0
3.11.2) Raid5
4) NVMe-oF
4.1) Проблемы Next-Next-Next для NVMe-oF
4.2) Raw Data
4.3) VDbench - 4k - 100% rng - 100% Write
4.4) VDbench - 4k - 100% rng - 100% read
4.5) VDbench - 4k - 80% rng - 50/50 r/w
4.6) VDbench - 64k - 80% rng - 75/25 r/w
4.7) VDbench - 8k - 80% rng - 75/25 r/w
4.8) FIO - 256k - 0% rng - 0/100 r/w
4.9) FIO - 4k - 100% rng - 100/0 r/w
4.10) FIO - 4k - 100% rng - 70/30 r/w
4.11) FIO - 8k - 100% rng 70/30 r/w
4.12) Сравнение софт рейдов
4.12.1) Raid0
4.12.2) Raid5
1. Описание тестового стенда
(назад к оглавлению)
Сервер виртуализации 1:
  • Motherboard: Supermicro H11SSL-i
  • CPU: EPYC 7302
  • RAM: 4x64GB Micron 2933MHz
  • Сеть SAN: 100GbE ConnectX-4 MT27700
  • Сеть LAN: 10GbE/25GbE ConnectX-4 LN EN
  • ОС: ESXi 7U3 build 20036586
Сервер виртуализации 2:
  • Motherboard: Supermicro H11DSI-NT
  • CPU: EPYC 7302 x2
  • RAM: 16x32GB Samsung 3200 MHz
  • Сеть SAN: 100GbE ConnectX-4 MT27700
  • Сеть LAN: 10GbE/25GbE ConnectX-4 LN EN
  • ОС: ESXi 7U3 build 20036586
Сервер хранения (гибридный сервер с PCIe Passthrough):
  • Motherboard: Tyan S8030 (ver 1GbE)
  • CPU: EPYC 7F52
  • RAM: 4x64GB Micron 2933MHz
  • Сеть SAN: 100GbE ConnectX-4 MT27700 x2
  • Сеть LAN: 10GbE/25GbE ConnectX-4 LN EN
  • Диски: 8 x PM9A3 1.92TB, форматированы в 512n

Схема подключения для тестов NVMe-oF и iSER:

pic
Схема подключения
2. Общая настройка серверов.
(назад к оглавлению)
Для тестирования была создана ВМ с iSER (LIO) и NVMe-oF (SPDK) таргетом, для NVMe-oF тестов параметры ВМ оставались неизменные, кроме ZFS тестов, а именно 6 ядер, 64ГБ памяти.
Для ZFS - в случае iSER память была расширена до 128ГБ, а в случае с NVMe-oF размер ВМ увеличен до 8 ядер и количество оперативной памяти до 128ГБ.

Конфигурация нагрузочных ВМ HCIbench-а

FIO тесты:
  • По 2 ВМ на хост (6 ВМ суммарно)
  • 8 vCPU
  • 16GB оперативной памяти
  • 8 дисков по 32ГБ
vdbench тесты:
  • По 2 ВМ на хост (6 ВМ суммарно)
  • 8 vCPU
  • 16GB оперативной памяти
  • 2 диска по 100ГБ

Конфигурация FIO

Тесты являются тестами из пресета vsan easyrun

Последовательная запись 256k

fio-8vmdk-100ws-256k-0rdpct-0randompct-1threads
[global]
runtime=600
time_based=1
ramp_time=360
direct=1
buffered=0
fsync=0
readwrite=write
random_generator=tausworthe64
blocksize=256K
ioengine=libaio
group_reporting
lat_percentiles=1
continue_on_error=all
[job0-7]
filename=/dev/sda
size=100%
iodepth=1
(к тесту iSER)
(к тесту NVMe-oF)

Случайное 100% чтение 4k

fio-8vmdk-100ws-4k-100rdpct-100randompct-4threads-50compress-50dedupe
[global]
runtime=600
time_based=1
ramp_time=360
direct=1
buffered=0
fsync=0
readwrite=randread
random_generator=tausworthe64
blocksize=4K
buffer_compress_percentage=50
dedupe_percentage=50
ioengine=libaio
group_reporting
lat_percentiles=1
continue_on_error=all
[job0-7]
filename=/dev/sd[a-h]
size=100%
iodepth=4
(к тесту iSER)
(к тесту NVMe-oF)

Случайное 70% чтение 30% запись 4k

fio-8vmdk-100ws-4k-70rdpct-100randompct-4threads-50compress-50dedupe
[global]
runtime=600
time_based=1
ramp_time=360
direct=1
buffered=0
fsync=0
readwrite=randrw
rwmixread=70
percentage_random=100
random_generator=tausworthe64
blocksize=4K
buffer_compress_percentage=50
dedupe_percentage=50
ioengine=libaio
group_reporting
lat_percentiles=1
continue_on_error=all
[job0-7]
filename=/dev/sd[a-h]
size=100%
iodepth=4
(к тесту iSER)
(к тесту NVMe-oF)

Случайное 50% чтение 50% записи 8к

fio-8vmdk-100ws-8k-50rdpct-100randompct-4threads-50compress-50dedupe
[global]
runtime=600
time_based=1
ramp_time=360
direct=1
buffered=0
fsync=0
readwrite=randrw
rwmixread=50
percentage_random=100
random_generator=tausworthe64
blocksize=8K
buffer_compress_percentage=50
dedupe_percentage=50
ioengine=libaio
group_reporting
lat_percentiles=1
continue_on_error=all
[job0-7]
filename=/dev/sd[a-h]
size=100%
iodepth=4
(к тесту iSER)
(к тесту NVMe-oF)

Конфигурация vdbench

Тесты взяты отсюда

100% cлучайная запись 4к, 4 потока на диск

vdb-2vmdk-100ws-4k-0rdpct-100randompct-4threads
2 raw disk, 100% random, 0% read
sd=sd1,lun=/dev/sda,openflags=o_direct,hitarea=0,range=(0,100),threads=4
sd=sd2,lun=/dev/sdb,openflags=o_direct,hitarea=0,range=(0,100),threads=4
wd=wd1,sd=(sd1,sd2),xfersize=4k,rdpct=0,seekpct=100
rd=run1,wd=wd1,iorate=max,elapsed=300
(к тесту iSER)
(к тесту NVMe-oF)

100% случайное чтение 4к, 4 потока на диск

vdb-2vmdk-100ws-4k-100rdpct-100randompct-4threads
2 raw disk, 100% random, 100% read
sd=sd1,lun=/dev/sda,openflags=o_direct,hitarea=0,range=(0,100),threads=4 sd=sd2,lun=/dev/sdb,openflags=o_direct,hitarea=0,range=(0,100),threads=4 wd=wd1,sd=(sd1,sd2),xfersize=4k,rdpct=100,seekpct=100 rd=run1,wd=wd1,iorate=max,elapsed=300
(к тесту iSER)
(к тесту NVMe-oF)

80% случайное, 20% последовательное, 50% чтение 50% записи 4к, 4 потока на диск

vdb-2vmdk-100ws-4k-50rdpct-80randompct-4threads
2 raw disk, 80% random, 50% read
sd=sd1,lun=/dev/sda,openflags=o_direct,hitarea=0,range=(0,100),threads=4 sd=sd2,lun=/dev/sdb,openflags=o_direct,hitarea=0,range=(0,100),threads=4 wd=wd1,sd=(sd1,sd2),xfersize=4k,rdpct=50,seekpct=80 rd=run1,wd=wd1,iorate=max,elapsed=300
(к тесту iSER)
(к тесту NVMe-oF)

80% случайное, 20% последовательное, 75% чтение 25% записи 64к, 4 потока на диск

vdb-2vmdk-100ws-64k-75rdpct-80randompct-4threads
2 raw disk, 80% random, 75% read
sd=sd1,lun=/dev/sda,openflags=o_direct,hitarea=0,range=(0,100),threads=4 sd=sd2,lun=/dev/sdb,openflags=o_direct,hitarea=0,range=(0,100),threads=4 wd=wd1,sd=(sd1,sd2),xfersize=64k,rdpct=75,seekpct=80 rd=run1,wd=wd1,iorate=max,elapsed=300
(к тесту iSER)
(к тесту NVMe-oF)

80% случайное, 20% последовательное, 75% чтение 25% записи 8к, 4 потока на диск

vdb-2vmdk-100ws-8k-75rdpct-80randompct-4threads
2 raw disk, 80% random, 75% read
sd=sd1,lun=/dev/sda,openflags=o_direct,hitarea=0,range=(0,100),threads=4 sd=sd2,lun=/dev/sdb,openflags=o_direct,hitarea=0,range=(0,100),threads=4 wd=wd1,sd=(sd1,sd2),xfersize=8k,rdpct=75,seekpct=80 rd=run1,wd=wd1,iorate=max,elapsed=300
(к тесту iSER)
(к тесту NVMe-oF)

Настройки хоста со стороны BIOS

Для настроек BIOS помогли эти две статьи (#1, #2):
NPS=1
L3 Cache as NUMA domain = Disabled
IOMMU = Enabled
PCIe Ten Bit Tag Support = Enabled
Prefered IO = Manual
Preferred IO Bus =
APBDIS = 1
Fixed SOC P-state=P0
DF C-states=Disable
Global C-State Control =Enable
Determinism Control = Manual
Determinism Enable = Power
TDP Control = Manual
TDP =
PPT Control = Manual
PPT =
Для наглядности Google Spreadsheet:
https://docs.google.com/spreadsheets/d/1f49vAqj-m4n4sSb8tD-PahenhBxXMx4Ju0QM_RvhU38/edit?usp=sharing
2.1 Особые условия
(назад к оглавлению)
В силу того, что SPDK работает по пуллинг принципу - он занимает все ядра, что ему отдали всегда на 100%. Поэтому процессам, которые хотят взять себе ресурсов, к примеру, для рассчёта parity возникает определённая проблема, включая даже банально, что так как LVM считает себя более приоритетным, SPDK ломается и теряет QID генерирую дубликаты.

Скрытый текст

spdk[2136]: ctrlr.c: 299:nvmf_ctrlr_add_qpair: WARNING: Duplicate QID detected (cntlid:2, qid:1), re-check in 1000us
spdk[2136]: ctrlr.c: 329:_retry_qid_check: WARNING: Retrying adding qpair, qid:1
spdk[2136]: ctrlr.c: 291:nvmf_ctrlr_add_qpair: ERROR: Got I/O connect with duplicate QID 1 (cntlid:2)
spdk[2136]: ctrlr.c: 299:nvmf_ctrlr_add_qpair: WARNING: Duplicate QID detected (cntlid:3, qid:1), re-check in 1000us
spdk[2136]: ctrlr.c: 329:_retry_qid_check: WARNING: Retrying adding qpair, qid:1
spdk[2136]: ctrlr.c: 291:nvmf_ctrlr_add_qpair: ERROR: Got I/O connect with duplicate QID 1 (cntlid:3)
spdk[2136]: ctrlr.c: 299:nvmf_ctrlr_add_qpair: WARNING: Duplicate QID detected (cntlid:3, qid:2), re-check in 1000us
spdk[2136]: ctrlr.c: 329:_retry_qid_check: WARNING: Retrying adding qpair, qid:2
spdk[2136]: ctrlr.c: 291:nvmf_ctrlr_add_qpair: ERROR: Got I/O connect with duplicate QID 2 (cntlid:3)
spdk[2136]: ctrlr.c: 299:nvmf_ctrlr_add_qpair: WARNING: Duplicate QID detected (cntlid:2, qid:2), re-check in 1000us
spdk[2136]: ctrlr.c: 329:_retry_qid_check: WARNING: Retrying adding qpair, qid:2
spdk[2136]: ctrlr.c: 291:nvmf_ctrlr_add_qpair: ERROR: Got I/O connect with duplicate QID 2 (cntlid:2)
Решением стало:
1) Уменьшение количество ядер отданных инициатору до 2 в случае с LVM Raid5, и до 4 в случае с ZFS Stipe и RaidZ
2) Увеличение размера ВМ с SPDK с 6 до 8 ядер.
Также для тестов ZFS все диски сперва были пропущены через blkdiscard с ожидаем после этого в 1 ночь, чтобы контроллер отработал все фоновые задачи.
3. iSER
(назад к оглавлению)
iSER особо не поменялся и его настройка всё такая же, что со стороны Вари, что со стороны Linux (targetcli)
На уровне IQN:
set attribute authentication=0 demo_mode_write_protect=0 generate_node_acls=1 cache_dynamic_acls=1
На уровне LUN-а:
set attribute emulate_3pc=1 emulate_tpu=1 emulate_caw=1 max_write_same_len=65535 emulate_tpws=1 is_nonrot=1
3.1 Raw Data
(назад к оглавлению)
Сырые значения сгруппированы по типу использованного софт рейда. Графические данные по имени теста.

MDADM Raid0

  MDADM Raid0
iSER IOPS MB/s CPU util latency
VDbench - 4k - 100% rng - 0/100 r/w - 8 thread per disk 284 723.17 1 112.19 6.20% 0.17
VDbench - 4k - 100% rng - 100/0 r/w - 8 thread per disk 225 953.33 882.63 7.00% 0.21
VDbench - 4k - 80% rng - 50/50 r/w - 8 thread per disk WRITE 257 869.23 1 007.30 8.27% 0.16
VDbench - 4k - 80% rng - 50/50 r/w - 8 thread per disk READ 0.21
VDbench - 64k - 80% rng - 75/25 r/w - 8 thread per disk WRITE 88 482.30 5 530.14 9.10% 0.53
VDbench - 64k - 80% rng - 75/25 r/w - 8 thread per disk READ 0.56
VDbench - 8k - 80% rng - 75/25 r/w - 8 thread per disk WRITE 227 262.77 1 775.49 10.28% 0.17
VDbench - 8k - 80% rng - 75/25 r/w - 8 thread per disk READ 0.22
Последовательная запись 256к (vsan easyrun) 11 166.15 2 790.67 7.25% 4.57
Случайное 100% чтение 4k (vsan easyrun) 361 540.68 1 411.67 8.97% 0.53
Случайное 70% чтение 30% запись 4k (vsan easyrun) WRITE 367 324.14 1 434.33 12.24% 0.49
Случайное 70% чтение 30% запись 4k (vsan easyrun) READ 0.54
Случайное 70% чтение 30% записи 8к (vsan easyrun) WRITE 343 850.64 2 686.00 16.61% 0.53
Случайное 70% чтение 30% записи 8к (vsan easyrun) READ 0.59

MDADM Raid5

  MDADM Raid5
iSER IOPS MB/s CPU util latency
VDbench - 4k - 100% rng - 0/100 r/w - 8 thread per disk 67 847.47 265.03 1.92% 0.88
VDbench - 4k - 100% rng - 100/0 r/w - 8 thread per disk 203 026.33 793.07 3.48% 0.24
VDbench - 4k - 80% rng - 50/50 r/w - 8 thread per disk WRITE 119 058.50 465.07 4.98% 0.70
VDbench - 4k - 80% rng - 50/50 r/w - 8 thread per disk READ 0.21
VDbench - 64k - 80% rng - 75/25 r/w - 8 thread per disk WRITE 24 256.00 1 516.00 4.73% 5.76
VDbench - 64k - 80% rng - 75/25 r/w - 8 thread per disk READ 0.40
VDbench - 8k - 80% rng - 75/25 r/w - 8 thread per disk WRITE 122 714.27 958.70 5.95% 0.67
VDbench - 8k - 80% rng - 75/25 r/w - 8 thread per disk READ 0.24
Последовательная запись 256к (vsan easyrun) 1 417.53 353.67 1.48% 16.97
Случайное 100% чтение 4k (vsan easyrun) 139 514.77 544.67 3.51% 0.69
Случайное 70% чтение 30% запись 4k (vsan easyrun) WRITE 120 456.52 470.33 6.03% 0.87
Случайное 70% чтение 30% запись 4k (vsan easyrun) READ 0.77
Случайное 70% чтение 30% записи 8к (vsan easyrun) WRITE 77 749.53 607.00 7.79% 1.45
Случайное 70% чтение 30% записи 8к (vsan easyrun) READ 1.02

LVM Raid0

  LVM Raid0
iSER IOPS MB/s CPU util latency
VDbench - 4k - 100% rng - 0/100 r/w - 8 thread per disk 299 001.83 1 167.97 12.60% 0.16
VDbench - 4k - 100% rng - 100/0 r/w - 8 thread per disk 234 285.33 915.18 14.10% 0.20
VDbench - 4k - 80% rng - 50/50 r/w - 8 thread per disk WRITE 268 003.80 1 046.89 15.50% 0.15
VDbench - 4k - 80% rng - 50/50 r/w - 8 thread per disk READ 0.20
VDbench - 64k - 80% rng - 75/25 r/w - 8 thread per disk WRITE 100 048.77 6 253.05 15.98% 0.52
VDbench - 64k - 80% rng - 75/25 r/w - 8 thread per disk READ 0.60
VDbench - 8k - 80% rng - 75/25 r/w - 8 thread per disk WRITE 233 907.83 1 827.41 18.73% 0.16
VDbench - 8k - 80% rng - 75/25 r/w - 8 thread per disk READ 0.22
Последовательная запись 256к (vsan easyrun) 18 722.06 4 680.00 4.78% 2.64
Случайное 100% чтение 4k (vsan easyrun) 350 870.49 1 370.33 6.73% 0.55
Случайное 70% чтение 30% запись 4k (vsan easyrun) WRITE 354 473.82 1 384.00 12.09% 0.51
Случайное 70% чтение 30% запись 4k (vsan easyrun) READ 0.56
Случайное 70% чтение 30% записи 8к (vsan easyrun) WRITE 332 271.50 2 595.33 16.86% 0.55
Случайное 70% чтение 30% записи 8к (vsan easyrun) READ 0.61

LVM Raid5

  LVM Raid5
iSER IOPS MB/s CPU util latency
VDbench - 4k - 100% rng - 0/100 r/w - 8 thread per disk 59 304.53 231.65 5.83% 0.80
VDbench - 4k - 100% rng - 100/0 r/w - 8 thread per disk 91 895.98 358.97 6.84% 0.52
VDbench - 4k - 80% rng - 50/50 r/w - 8 thread per disk WRITE 81 976.13 320.22 7.62% 0.71
VDbench - 4k - 80% rng - 50/50 r/w - 8 thread per disk READ 0.45
VDbench - 64k - 80% rng - 75/25 r/w - 8 thread per disk WRITE 13 216.58 826.04 8.13% 7.45
VDbench - 64k - 80% rng - 75/25 r/w - 8 thread per disk READ 2.36
VDbench - 8k - 80% rng - 75/25 r/w - 8 thread per disk WRITE 77 631.65 606.50 9.56% 0.82
VDbench - 8k - 80% rng - 75/25 r/w - 8 thread per disk READ 0.55
Последовательная запись 256к (vsan easyrun) 1 889.59 472.00 3.23% 25.60
Случайное 100% чтение 4k (vsan easyrun) 123 334.01 481.25 4.06% 1.56
Случайное 70% чтение 30% запись 4k (vsan easyrun) WRITE 106 681.02 416.00 6.37% 1.88
Случайное 70% чтение 30% запись 4k (vsan easyrun) READ 1.76
Случайное 70% чтение 30% записи 8к (vsan easyrun) WRITE 73 436.82 573.25 8.07% 2.84
Случайное 70% чтение 30% записи 8к (vsan easyrun) READ 2.39

ZFS Stripe (Raid0)

  ZFS Stripe (Raid0)
iSER IOPS MB/s CPU util latency
VDbench - 4k - 100% rng - 0/100 r/w - 8 thread per disk 13 854.37 54.12 10.95% 3.46
VDbench - 4k - 100% rng - 100/0 r/w - 8 thread per disk 78 314.83 305.92 11.06% 0.61
VDbench - 4k - 80% rng - 50/50 r/w - 8 thread per disk WRITE 29 376.40 114.75 11.07% 1.82
VDbench - 4k - 80% rng - 50/50 r/w - 8 thread per disk READ 1.45
VDbench - 64k - 80% rng - 75/25 r/w - 8 thread per disk WRITE 18 672.80 1 167.06 11.96% 2.31
VDbench - 64k - 80% rng - 75/25 r/w - 8 thread per disk READ 2.74
VDbench - 8k - 80% rng - 75/25 r/w - 8 thread per disk WRITE 38 804.50 303.16 14.39% 1.26
VDbench - 8k - 80% rng - 75/25 r/w - 8 thread per disk READ 1.24
Последовательная запись 256к (vsan easyrun) 3 424.75 855.75 2.55% 14.02
Случайное 100% чтение 4k (vsan easyrun) 83 428.24 325.50 5.15% 2.32
Случайное 70% чтение 30% запись 4k (vsan easyrun) WRITE 40 025.47 155.75 7.41% 5.24
Случайное 70% чтение 30% запись 4k (vsan easyrun) READ 4.69
Случайное 70% чтение 30% записи 8к (vsan easyrun) WRITE 28 179.41 219.75 8.60% 7.34
Случайное 70% чтение 30% записи 8к (vsan easyrun) READ 6.30

ZFS RaidZ (Raid5)

  ZFS RaidZ (Raid5)
iSER IOPS MB/s CPU util latency
VDbench - 4k - 100% rng - 0/100 r/w - 8 thread per disk 12 718.27 49.68 10.10% 3.77
VDbench - 4k - 100% rng - 100/0 r/w - 8 thread per disk 72 718.70 284.06 11.33% 0.66
VDbench - 4k - 80% rng - 50/50 r/w - 8 thread per disk WRITE 24 668.73 96.36 12.59% 2.40
VDbench - 4k - 80% rng - 50/50 r/w - 8 thread per disk READ 1.49
VDbench - 64k - 80% rng - 75/25 r/w - 8 thread per disk WRITE 15 468.27 966.77 13.69% 2.09
VDbench - 64k - 80% rng - 75/25 r/w - 8 thread per disk READ 3.51
VDbench - 8k - 80% rng - 75/25 r/w - 8 thread per disk WRITE 35 068.17 273.97 15.93% 1.39
VDbench - 8k - 80% rng - 75/25 r/w - 8 thread per disk READ 1.37
Последовательная запись 256к (vsan easyrun) 3 213.39 803.00 3.64% 15.02
Случайное 100% чтение 4k (vsan easyrun) 75 045.22 292.33 5.97% 2.56
Случайное 70% чтение 30% запись 4k (vsan easyrun) WRITE 34 054.32 132.33 8.69% 6.14
Случайное 70% чтение 30% запись 4k (vsan easyrun) READ 5.43
Случайное 70% чтение 30% записи 8к (vsan easyrun) WRITE 24 047.15 187.33 10.08% 8.63
Случайное 70% чтение 30% записи 8к (vsan easyrun) READ 7.34

ZFS Stripe (Raid0) без чексумм

  ZFS Stripe nochecksum
iSER IOPS MB/s CPU util latency
VDbench - 4k - 100% rng - 0/100 r/w - 4 thread per disk 21 469.40 83.86 6.10% 2.23
VDbench - 4k - 100% rng - 100/0 r/w - 4 thread per disk 81 155.30 317.01 8.15% 0.59
VDbench - 4k - 80% rng - 50/50 r/w - 4 thread per disk WRITE 39 117.90 152.80 10.35% 1.29
VDbench - 4k - 80% rng - 50/50 r/w - 4 thread per disk READ 1.17
VDbench - 64k - 80% seq - 75/25 r/w - 4 thread per disk WRITE 20 887.43 1305.46 12.27% 2.02
VDbench - 64k - 80% seq - 75/25 r/w - 4 thread per disk READ 2.44
VDbench - 8k - 80% rng - 75/25 r/w - 4 thread per disk WRITE 48 347.85 377.72 14.71% 1.01
VDbench - 8k - 80% rng - 75/25 r/w - 4 thread per disk READ 1.00
Последовательная запись 256к (vsan easyrun) 3 600.64 899.67 6.37% 13.34
Случайное 100% чтение 4k (vsan easyrun) 84 736.52 330.33 6.92% 2.27
Случайное 70% чтение 30% запись 4k (vsan easyrun) WRITE 51 076.97 199.33 7.87% 3.94
Случайное 70% чтение 30% запись 4k (vsan easyrun) READ 3.69
Случайное 70% чтение 30% записи 8к (vsan easyrun) WRITE 37 120.03 289.33 8.95% 5.48
Случайное 70% чтение 30% записи 8к (vsan easyrun) READ 4.88
3.2 VDbench - 4k - 100% rng - 100% Write
(назад к оглавлению)
(назад к описанию теста)
pic
График Latency на запись
pic
Суммарный график IO в МБ/с
3.3 VDbench - 4k - 100% rng - 100% read
(назад к оглавлению)
(назад к описанию теста)
pic
График Latency на чтение
pic
Суммарный график IO в МБ/с
3.4 VDbench - 4k - 80% rng - 50/50 r/w
(назад к оглавлению)
(назад к описанию теста)
pic
График Latency, красный - запись, синий - чтение
pic
Суммарный график IO в МБ/с
3.5 VDbench - 64k - 80% rng - 75/25 r/w
(назад к оглавлению)
(назад к описанию теста)
pic
График Latency, красный - запись, синий - чтение
pic
Суммарный график IO в МБ/с
3.6 VDbench - 8k - 80% rng - 75/25 r/w
(назад к оглавлению)
(назад к описанию теста)
pic
График Latency, красный - запись, синий - чтение
pic
Суммарный график IO в МБ/с
3.7 FIO - 256k - 0% rng - 0/100 r/w
(назад к оглавлению)
(назад к описанию теста)
pic
График Latency на запись
pic
Суммарный график IO в МБ/с
3.8 FIO - 4k - 100% rng - 100/0 r/w
(назад к оглавлению)
(назад к описанию теста)
pic
График Latency на чтение
pic
Суммарный график IO в МБ/с
3.9 FIO - 4k - 100% rng - 70/30 r/w
(назад к оглавлению)
(назад к описанию теста)
pic
График Latency, красный - запись, синий - чтение
pic
Суммарный график IO в МБ/с
3.10 FIO - 8k - 100% rng 70/30 r/w
(назад к оглавлению)
(назад к описанию теста)
pic
График Latency, красный - запись, синий - чтение
pic
Суммарный график IO в МБ/с
3.11 Сравнение софт рейдов
3.11.1 Raid0
pic
Общий график по Raid0. По вертикали МБ/с, по горизонтали тесты
Итогом стало лидерство LVM в тестах где нагрузка идёт в рамках пары дисков (vdbench) и аналогичное по % лидерство mdadm в тестах где есть множество дисков (8 штук). Также стоит отметить тот факт, что отключение Checksum даёт следующий прирост для производительности ZFS (порядка ~22%):
pic
Сравнение ZFS с и без чексумм при подключении через iSER
3.11.2 Raid5
pic
По вертикали МБ/с, по горизонтали тесты
4. NVMe-oF
4.1 Проблемы Next-Next-Next для NVMe-oF
При простом включении NVMe-oF (включая настройки [url=https://help.mikrotik.com/docs/spaces/ROS/pages/189497483/Quality+of+Service#QualityofService-RDMAoverConvergedEthernet(RoCE)]тут[/url], тути тут) и SPDK в начале всё работало, но в ходе тестов начала проявляться значительная деградация, вплоть до того, что датастор открывался по 5-12 секунд, при простом копировании ВМок производительности других ВМ падала в 0 (именно в 0, т.е. IO вообще не проходили), а в логах сыпалось:
2025-05-17T19:17:46.535Z warning hostd[2099859] [Originator@6876 sub=IoTracker] In thread 2099865, open("/vmfs/volumes/6828d6a7-6e0bb546-8c25-ac1f6be8140e/hci-fio-datastore-6001-1-4/hci-fio-datastore-6001-1-4_1.vmdk~") took over 5 sec.
А средний отклик IO достигал вплоть до 9 секунд судя по графикам.
В ходе изучения всех возможных настроек производительности для выхода из этой ситуации нашлись следующие настройки, помимо настроек BIOS обозначенных выше.
Для настроек самой CX4:
/opt/mellanox/bin/mlxconfig -d mt4115_pciconf0 set LLDP_NB_DCBX_P1=1 LLDP_NB_TX_MODE_P1=2 LLDP_NB_RX_MODE_P1=2 LLDP_NB_DCBX_P2=1 LLDP_NB_TX_MODE_P2=2 LLDP_NB_RX_MODE_P2=2 CNP_DSCP_P1=48 CNP_802P_PRIO_P1=6 CNP_DSCP_P2=48 CNP_802P_PRIO_P2=6
Для ESXi финальными настройками стало:
esxcli system module parameters set -m nmlx5_core -p "pfctx=0x08 pfcrx=0x08 dcbx=2 trust_state=2 DRSS=4 RSS=8 GEN_RSS=3 max_queues=32 dropless_rq=1"
esxcli system module parameters set -m nmlx5_rdma -p "dscp_force=26 pcp_force=3 roce_version=2"
esxcli network nic ring current set -n vmnicX -r 8192 -t 8192
Полная резервация частоты для ВМ с дисками и повышение Shares до High.
Для Linux внутри ВМ финальной настройкой стало:

Скрипт запуска SPDK таргета (part 1)

#!/bin/bash
mst start
tc_wrap.py -i ens257f0np0
mlnx_qos -i ens257f0np0 --cable_len=1
mlnx_qos -i ens257f0np0 --trust pcp
mlnx_qos -i ens257f0np0 --pfc 0,0,0,1,0,0,0,0
mkdir -p /sys/kernel/config/rdma_cm/mlx5_0
sysctl -w net.ipv4.tcp_ecn=1
echo 6 > /sys/class/net/ens257f0np0/ecn/roce_np/cnp_802p_prio
echo 106 | sudo tee /sys/class/infiniband/mlx5_0/tc/1/traffic_class
cma_roce_tos -d mlx5_0 -t 106
ip link set ens257f0np0.101 type vlan egress-qos-map 4:3
ip link set ens257f0np0.102 type vlan egress-qos-map 4:3
ip link set ens257f0np0.103 type vlan egress-qos-map 4:3
sysctl -w net.core.netdev_budget=600
sysctl -w net.core.rmem_max=16777216
sysctl -w net.ipv4.tcp_rmem=“16384 349520 16777216”
sysctl -w net.ipv4.tcp_congestion_control=cubic
sysctl -w net.core.netdev_budget_usecs=4000
ethtool -G ens257f0np0 rx 8192 tx 8192
mlnx_qos -i ens257f0np0 --tsa=ets,ets,ets,ets,ets,ets,ets,ets --tcbw=0,0,0,100,0,0,0,0
Что удивительно, но даже в случае виртуализации Ubuntu считала что у процессора есть 8 C-state и пыталась их использовать, поэтому их тоже пришлось выключить:
GRUB_CMDLINE_LINUX_DEFAULT="mitigations=off processor.max_cstate=0 default_hugepagesz=1G hugepagesz=1G"
Для SPDK настройками запуска стало:

Скрипт запуска SPDK таргета (part 2)

PCI_ALLOWED=“none” HUGEMEM=40960 /home/storage/spdk/scripts/setup.sh
/home/storage/spdk/build/bin/nvmf_tgt -m 0x3F -s 40G --wait-for-rpc &
sleep 10
/home/storage/spdk/scripts/rpc.py log_set_level DEBUG
/home/storage/spdk/scripts/rpc.py log_set_print_level DEBUG
/home/storage/spdk/scripts/rpc.py iobuf_set_options --small-pool-count 8192 --large-pool-count 4096
/home/storage/spdk/scripts/rpc.py framework_start_init
/home/storage/spdk/scripts/rpc.py nvmf_create_transport -t RDMA -u 16384 -i 131072 -c 8192 -m 127 -q 4096 --acceptor-poll-rate 100
/home/storage/spdk/scripts/rpc.py bdev_aio_create /dev/nvme/nvme_stripe nvme_spdk --fallocate
/home/storage/spdk/scripts/rpc.py nvmf_create_subsystem nqn.2024-05.io.spdk:cnode1 -a -s SPDK00 -d SPDK
/home/storage/spdk/scripts/rpc.py nvmf_subsystem_add_ns nqn.2024-05.io.spdk:cnode1 nvme_spdk
Со стороны Mikrotik настройки в целом в сооветствии со статьёй с одним исключением. На уровне буфферов выстановлены следущие настройки:
pic
Настройка буферов в микротике
Благодаря этому получилось полностью избавить от дропов (до этого при тестах на последотельную запись были дропы пакетов)
pic
Итоговые показатели переданных пакетов за время тестов
4.2 Raw Data

MDADM Raid0

  MDADM Raid0
NVMe-oF IOPS Bandwidth [MB/s] CPU util [%] latency [ms]
VDbench - 4k - 100% rng - 100% Write - 4 thread per disk 450 770.63 1 760.82 8.81% 0.10
VDbench - 4k - 100% rng - 100% read - 4 thread per disk 321 877.10 1 257.33 10.61% 0.15
VDbench - 4k - 80% rng - 50/50 r/w - 4 thread per disk WRITE 375 080.07 1 465.17 12.50% 0.10
VDbench - 4k - 80% rng - 50/50 r/w - 4 thread per disk READ 0.15
VDbench - 64k - 80% seq - 75/25 r/w - 4 thread per disk WRITE 88 269.87 5 516.88 13.67% 0.46
VDbench - 64k - 80% seq - 75/25 r/w - 4 thread per disk READ 0.58
VDbench - 8k - 80% rng - 75/25 r/w - 4 thread per disk WRITE 329 445.77 2 573.80 15.41% 0.10
VDbench - 8k - 80% rng - 75/25 r/w - 4 thread per disk READ 0.16
Последовательная запись 256к 22 864.93 5 715.50 6.75% 2.21
Случайное 100% чтение 4k 488 403.93 1 907.25 12.70% 0.40
Случайное 70% чтение 30% запись 4k WRITE 486 361.39 1 899.50 18.49% 0.36
Случайное 70% чтение 30% запись 4k READ 0.41
Случайное 70% чтение 30% записи 8к WRITE 473 253.78 3 696.75 23.63% 0.39
Случайное 70% чтение 30% записи 8к READ 0.42

MDADM Raid5

  MDADM Raid5
NVMe-oF IOPS Bandwidth [MB/s] CPU util [%] latency [ms]
VDbench - 4k - 100% rng - 100% Write - 4 thread per disk 60 531.05 236.44 8.45% 0.82
VDbench - 4k - 100% rng - 100% read - 4 thread per disk 308 500.73 1 205.08 9.89% 0.16
VDbench - 4k - 80% rng - 50/50 r/w - 4 thread per disk WRITE 102 964.75 402.21 11.13% 0.69
VDbench - 4k - 80% rng - 50/50 r/w - 4 thread per disk READ 0.24
VDbench - 64k - 80% seq - 75/25 r/w - 4 thread per disk WRITE 21 025.80 1 314.11 12.02% 7.65
VDbench - 64k - 80% seq - 75/25 r/w - 4 thread per disk READ 0.49
VDbench - 8k - 80% rng - 75/25 r/w - 4 thread per disk WRITE 110 443.53 862.85 13.22% 0.98
VDbench - 8k - 80% rng - 75/25 r/w - 4 thread per disk READ 0.25
Последовательная запись 256к 1398.76 349.00 7.77% 35.52
Случайное 100% чтение 4k 477 304.20 1 864.00 12.79% 0.41
Случайное 70% чтение 30% запись 4k WRITE 176 430.51 688.75 14.99% 1.95
Случайное 70% чтение 30% запись 4k READ 0.73
Случайное 70% чтение 30% записи 8к WRITE 61 383.76 479.25 15.81% 4.50
Случайное 70% чтение 30% записи 8к READ 1.83

LVM Raid0

  LVM Raid0
NVMe-oF IOPS Bandwidth [MB/s] CPU util [%] latency [ms]
VDbench - 4k - 100% rng - 100% Write - 4 thread per disk 459 686.88 1 795.65 17.01% 0.10
VDbench - 4k - 100% rng - 100% read - 4 thread per disk 325 189.12 1 270.27 18.50% 0.15
VDbench - 4k - 80% rng - 50/50 r/w - 4 thread per disk WRITE 374 578.24 1 463.19 20.74% 0.10
VDbench - 4k - 80% rng - 50/50 r/w - 4 thread per disk READ 0.15
VDbench - 64k - 80% seq - 75/25 r/w - 4 thread per disk WRITE 90 484.62 5 655.28 22.08% 0.47
VDbench - 64k - 80% seq - 75/25 r/w - 4 thread per disk READ 0.58
VDbench - 8k - 80% rng - 75/25 r/w - 4 thread per disk WRITE 328 563.80 2 566.91 24.30% 0.10
VDbench - 8k - 80% rng - 75/25 r/w - 4 thread per disk READ 0.16
Последовательная запись 256к 21 587.40 5396.40 10.48% 2.28
Случайное 100% чтение 4k 485 780.49 1 897.20 14.57% 0.40
Случайное 70% чтение 30% запись 4k WRITE 473 075.11 1 847.40 18.85% 0.37
Случайное 70% чтение 30% запись 4k READ 0.42
Случайное 70% чтение 30% записи 8к WRITE 456 659.78 3 567.00 23.51% 0.40
Случайное 70% чтение 30% записи 8к READ 0.44

LVM Raid5

  LVM Raid5
NVMe-oF IOPS Bandwidth [MB/s] CPU load [%] latency [ms]
VDbench - 4k - 100% rng - 100% Write - 4 thread per disk 79463.13 310.40 12.51% 0.60
VDbench - 4k - 100% rng - 100% read - 4 thread per disk 290 190.37 1133.56 14.09% 0.16
VDbench - 4k - 80% rng - 50/50 r/w - 4 thread per disk WRITE 135 977.73 531.17 14.85% 0.55
VDbench - 4k - 80% rng - 50/50 r/w - 4 thread per disk READ 0.16
VDbench - 64k - 80% seq - 75/25 r/w - 4 thread per disk WRITE 32 461.10 2 028.82 16.05% 4.98
VDbench - 64k - 80% seq - 75/25 r/w - 4 thread per disk READ 0.31
VDbench - 8k - 80% rng - 75/25 r/w - 4 thread per disk WRITE 153 652.13 1 200.41 17.87% 0.75
VDbench - 8k - 80% rng - 75/25 r/w - 4 thread per disk READ 0.17
Последовательная запись 256к 2 291.33 572.67 3.13% 22.19
Случайное 100% чтение 4k 181 423.16 708.00 4.63% 1.06
Случайное 70% чтение 30% запись 4k WRITE 124 911.17 487.00 6.03% 1.61
Случайное 70% чтение 30% запись 4k READ 1.50
Случайное 70% чтение 30% записи 8к WRITE 87 156.36 680.67 7.23% 3.12
Случайное 70% чтение 30% записи 8к READ 1.28

ZFS Stripe (Raid0)

  ZFS Stripe
NVMe-oF IOPS Bandwidth [MB/s] CPU util [%] latency [ms]
VDbench - 4k - 100% rng - 100% Write - 4 thread per disk 15 179.28 59.29 9.84% 3.16
VDbench - 4k - 100% rng - 100% read - 4 thread per disk 72 292.00 282.39 11.32% 0.66
VDbench - 4k - 80% rng - 50/50 r/w - 4 thread per disk WRITE 28 532.58 111.46 13.08% 1.73
VDbench - 4k - 80% rng - 50/50 r/w - 4 thread per disk READ 1.63
VDbench - 64k - 80% seq - 75/25 r/w - 4 thread per disk WRITE 19 079.55 1192.47 14.85% 1.82
VDbench - 64k - 80% seq - 75/25 r/w - 4 thread per disk READ 2.74
VDbench - 8k - 80% rng - 75/25 r/w - 4 thread per disk WRITE 38 681.13 302.20 16.68% 1.26
VDbench - 8k - 80% rng - 75/25 r/w - 4 thread per disk READ 1.23
Последовательная запись 256к 4 202.06 1 050.00 6.96% 12.00
Случайное 100% чтение 4k 78 842.56 307.50 8.50% 2.45
Случайное 70% чтение 30% запись 4k WRITE 38 714.70 150.75 9.67% 5.04
Случайное 70% чтение 30% запись 4k READ 4.96
Случайное 70% чтение 30% записи 8к WRITE 28 630.00 223.25 10.52% 7.05
Случайное 70% чтение 30% записи 8к READ 6.43

ZFS RaidZ (Raid5)

  ZFS RaidZ
NVMe-oF IOPS Bandwidth [MB/s] CPU util [%] latency [ms]
VDbench - 4k - 100% rng - 100% Write - 4 thread per disk 12 260.97 47.89 12.48% 3.91
VDbench - 4k - 100% rng - 100% read - 4 thread per disk 57 072.60 222.94 13.27% 0.84
VDbench - 4k - 80% rng - 50/50 r/w - 4 thread per disk WRITE 22 959.23 89.68 13.98% 2.14
VDbench - 4k - 80% rng - 50/50 r/w - 4 thread per disk READ 2.06
VDbench - 64k - 80% seq - 75/25 r/w - 4 thread per disk WRITE 14 061.90 878.87 14.85% 2.13
VDbench - 64k - 80% seq - 75/25 r/w - 4 thread per disk READ 3.84
VDbench - 8k - 80% rng - 75/25 r/w - 4 thread per disk WRITE 30 963.83 241.91 16.65% 1.58
VDbench - 8k - 80% rng - 75/25 r/w - 4 thread per disk READ 1.54
Последовательная запись 256к 2 928.63 731.50 7.65% 16.96
Случайное 100% чтение 4k 61 621.75 240.50 8.61% 3.13
Случайное 70% чтение 30% запись 4k WRITE 30 315.13 118.00 9.56% 6.48
Случайное 70% чтение 30% запись 4k READ 6.38
Случайное 70% чтение 30% записи 8к WRITE 22 773.56 177.50 10.24% 9.23
Случайное 70% чтение 30% записи 8к READ 8.16
4.3 VDbench - 4k - 100% rng - 100% Write
(назад к оглавлению)
(назад к описанию теста)
pic
График Latency на запись
pic
Суммарный график IO в МБ/с
4.4 VDbench - 4k - 100% rng - 100% read
(назад к оглавлению)
(назад к описанию теста)
pic
График Latency на чтение
pic
Суммарный график IO в МБ/с
4.5 VDbench - 4k - 80% rng - 50/50 r/w
(назад к оглавлению)
(назад к описанию теста)
pic
График Latency, красный - запись, синий - чтение
pic
Суммарный график IO в МБ/с
4.6 VDbench - 64k - 80% rng - 75/25 r/w
(назад к оглавлению)
(назад к описанию теста)
pic
Красный график задержка на запись, синий на чтение
Вот тут наглядно видно, что mdadm не хватает ядер учитывая, что таргет NVMe скушал практически всё себе. LVM тоже не очень хорошо, даже с учётом всех особых условий
pic
Суммарный график IO в МБ/с
4.7 VDbench - 8k - 80% rng - 75/25 r/w
(назад к оглавлению)
(назад к описанию теста)
pic
Красный график задержка на запись, синий на чтение
pic
Суммарный график IO в МБ/с
4.8 FIO - 256k - 0% rng - 0/100 r/w
(назад к оглавлению)
(назад к описанию теста)
pic
График Latency на запись
Ситуация схожа с 64k тестом, опять же mdadm не хватает CPU, но в отличии от LVM - он не ломает таргет, поэтому послабления не получил. Но ZFS конечно на последовательной записи большим асинхронным блоком в режиме рейда лидер, в конце концов ему достаточно положить блок в память, чтобы быть готовым принять следующим, в то время как mdadm и lvm прежде чем писать дальше нужно сперва записать предыдующий блок.
pic
Суммарный график IO в МБ/с
4.9 FIO - 4k - 100% rng - 100/0 r/w
(назад к оглавлению)
(назад к описанию теста)
pic
График Latency на чтение
pic
Суммарный график IO в МБ/с
4.10 FIO - 4k - 100% rng - 70/30 r/w
(назад к оглавлению)
(назад к описанию теста)
pic
Красный график задержка на запись, синий на чтение
pic
Суммарный график IO в МБ/с
4.11 FIO - 8k - 100% rng 70/30 r/w
(назад к оглавлению)
(назад к описанию теста)
pic
Красный график задержка на запись, синий на чтение
pic
Суммарный график IO в МБ/с
4.12 Сравнение софт рейдов
4.12.1 Raid 0
pic
Общий график по Raid0. По вертикали МБ/с, по горизонтали тесты
4.12.2 Raid 5
pic
Общий график по Raid5. По вертикали МБ/с, по горизонтали тесты
Вывод
mdadm показывает себя в Raid5 (если ему дать послабления в NVMe-oF как для ZFS), LVM в raid0. ZFS ваш выбор если у вас ВСЯ нагрузка это много-много асинхронного чтения\записи блоками по 64+кб.

Графическое представление NVMe-oF vs iSER

Зелёный - NVMe-oF
Бордовый - iSER

mdadm Raid0

pic
Значения как и ожидались, NVMe-oF показывает результаты лучше по всем тестам, кроме mix r/w большим блоком, где показывается паритет

mdadm Raid5

pic
Даже не смотря на нехватку ресурсов - mdadm с nvme-of всё ещё прекрасно себя чувствует в половине тестов.

LVM Raid0

pic
Из интересной аномалии тут это не паритет 64кб операции, но он объясняется тем, что в случае с NVMe-oF у нас оставалась высокая задержка на запись 64кб блоком при одновременном чтении.

LVM Raid5

pic
LVM с учётом особых условий демонстрирует ожидаемый эффект от NVMe-oF по всем тестам,

ZFS Stripe (Raid0)

pic
С ZFS картина конечно сильно печальней, для сочетания NVMe-oF и ZFS однозначно нужен отдельный хост, потому что что таргет, что ZFS насилуют CPU только так. Количество ядер надо брать по количеству NVMe дисков + ещё нужно на таргет количество хостов / 2 округленное в большую сторону. Т.е. для 3 хостов минимум 2 ядра, для 5 - 3 ядра, и т.д.

ZFS RaidZ (Raid5)

pic
Картина аналогичная Stripe, то так как RaidZ ещё более CPU intensive - iSER показывает однозначный выигрыш.
Итоговая картина NVMe-oF vs iSER с цветовой гаммой выглядит следующим образом, в ней показатели NVMe-oF поделены на iSER.
pic
Raid0, NVMe-oF vs iSER
pic
Raid5 NVMe-oF vs iSER
В столбце IOPS, если NVMe-oF / iSER >= 1, то это зелёный цвет (мы получили больше IOPS на NVMe-oF), в противном случае оттенок коричневого
В столбце Latency, если NVMe-oF / iSER <= 1, то это зелёный цвет (мы получили задержку ниже при использовании NVMe-oF), в противном случае оттенок коричневого
В столбце CPU Load, если NVMe-oF / iSER <= 1, то это зелёный цвет (мы получили показатели CPU USED на уровне кластера ниже при использовании NVMe-oF), в противном случае оттенок коричневого
Почему мы проигрываем по CPU, когда основная задача NVMe-oF разгрузить CPU? Потому что таргет SPDK работает по пуллинг механизму, а значит он работает всегда на 100% всех ядер, которые ему отдали, а CPU load указан для всего кластера, а не только для ВМ-ок. Если выносить SPDK на отдельную физическую машину, то CPU load тоже будет в зелёной зоне:
И в случае ZFS есть не менее интересный нюанс. Из-за того, что SPDK всегда использует, ядра что ему выдали на 100% - ZFS банально не хватает CPU на то, чтобы выполнить свои операции, из-за чего мы практически всегда проигрываем iSER таргету в ядре. Аналогичная ситуация с mdadm в рейде, но в отличии от ZFS ему не было послаблений в лице более жирной ВМ.-Источник
 
Loading...
Error