|
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:
Схема подключения
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 (назад к оглавлению)
(назад к описанию теста)

График Latency на запись

Суммарный график IO в МБ/с 3.3 VDbench - 4k - 100% rng - 100% read (назад к оглавлению)
(назад к описанию теста)

График Latency на чтение

Суммарный график IO в МБ/с 3.4 VDbench - 4k - 80% rng - 50/50 r/w (назад к оглавлению)
(назад к описанию теста)

График Latency, красный - запись, синий - чтение

Суммарный график IO в МБ/с 3.5 VDbench - 64k - 80% rng - 75/25 r/w (назад к оглавлению)
(назад к описанию теста)

График Latency, красный - запись, синий - чтение

Суммарный график IO в МБ/с 3.6 VDbench - 8k - 80% rng - 75/25 r/w (назад к оглавлению)
(назад к описанию теста)

График Latency, красный - запись, синий - чтение

Суммарный график IO в МБ/с 3.7 FIO - 256k - 0% rng - 0/100 r/w (назад к оглавлению)
(назад к описанию теста)

График Latency на запись

Суммарный график IO в МБ/с 3.8 FIO - 4k - 100% rng - 100/0 r/w (назад к оглавлению)
(назад к описанию теста)

График Latency на чтение

Суммарный график IO в МБ/с 3.9 FIO - 4k - 100% rng - 70/30 r/w (назад к оглавлению)
(назад к описанию теста)

График Latency, красный - запись, синий - чтение

Суммарный график IO в МБ/с 3.10 FIO - 8k - 100% rng 70/30 r/w (назад к оглавлению)
(назад к описанию теста)

График Latency, красный - запись, синий - чтение

Суммарный график IO в МБ/с 3.11 Сравнение софт рейдов 3.11.1 Raid0

Общий график по Raid0. По вертикали МБ/с, по горизонтали тесты Итогом стало лидерство LVM в тестах где нагрузка идёт в рамках пары дисков (vdbench) и аналогичное по % лидерство mdadm в тестах где есть множество дисков (8 штук). Также стоит отметить тот факт, что отключение Checksum даёт следующий прирост для производительности ZFS (порядка ~22%):

Сравнение ZFS с и без чексумм при подключении через iSER 3.11.2 Raid5

По вертикали МБ/с, по горизонтали тесты 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 настройки в целом в сооветствии со статьёй с одним исключением. На уровне буфферов выстановлены следущие настройки:

Настройка буферов в микротике Благодаря этому получилось полностью избавить от дропов (до этого при тестах на последотельную запись были дропы пакетов)

Итоговые показатели переданных пакетов за время тестов 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 (назад к оглавлению)
(назад к описанию теста)

График Latency на запись

Суммарный график IO в МБ/с 4.4 VDbench - 4k - 100% rng - 100% read (назад к оглавлению)
(назад к описанию теста)

График Latency на чтение

Суммарный график IO в МБ/с 4.5 VDbench - 4k - 80% rng - 50/50 r/w (назад к оглавлению)
(назад к описанию теста)

График Latency, красный - запись, синий - чтение

Суммарный график IO в МБ/с 4.6 VDbench - 64k - 80% rng - 75/25 r/w (назад к оглавлению)
(назад к описанию теста)

Красный график задержка на запись, синий на чтение Вот тут наглядно видно, что mdadm не хватает ядер учитывая, что таргет NVMe скушал практически всё себе. LVM тоже не очень хорошо, даже с учётом всех особых условий

Суммарный график IO в МБ/с 4.7 VDbench - 8k - 80% rng - 75/25 r/w (назад к оглавлению)
(назад к описанию теста)

Красный график задержка на запись, синий на чтение

Суммарный график IO в МБ/с 4.8 FIO - 256k - 0% rng - 0/100 r/w (назад к оглавлению)
(назад к описанию теста)

График Latency на запись Ситуация схожа с 64k тестом, опять же mdadm не хватает CPU, но в отличии от LVM - он не ломает таргет, поэтому послабления не получил. Но ZFS конечно на последовательной записи большим асинхронным блоком в режиме рейда лидер, в конце концов ему достаточно положить блок в память, чтобы быть готовым принять следующим, в то время как mdadm и lvm прежде чем писать дальше нужно сперва записать предыдующий блок.

Суммарный график IO в МБ/с 4.9 FIO - 4k - 100% rng - 100/0 r/w (назад к оглавлению)
(назад к описанию теста)

График Latency на чтение

Суммарный график IO в МБ/с 4.10 FIO - 4k - 100% rng - 70/30 r/w (назад к оглавлению)
(назад к описанию теста)

Красный график задержка на запись, синий на чтение

Суммарный график IO в МБ/с 4.11 FIO - 8k - 100% rng 70/30 r/w (назад к оглавлению)
(назад к описанию теста)

Красный график задержка на запись, синий на чтение

Суммарный график IO в МБ/с 4.12 Сравнение софт рейдов 4.12.1 Raid 0

Общий график по Raid0. По вертикали МБ/с, по горизонтали тесты 4.12.2 Raid 5

Общий график по Raid5. По вертикали МБ/с, по горизонтали тесты Вывод mdadm показывает себя в Raid5 (если ему дать послабления в NVMe-oF как для ZFS), LVM в raid0. ZFS ваш выбор если у вас ВСЯ нагрузка это много-много асинхронного чтения\записи блоками по 64+кб.
Графическое представление NVMe-oF vs iSER
Зелёный - NVMe-oF
Бордовый - iSER
mdadm Raid0

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

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

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

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

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

Картина аналогичная Stripe, то так как RaidZ ещё более CPU intensive - iSER показывает однозначный выигрыш.
Итоговая картина NVMe-oF vs iSER с цветовой гаммой выглядит следующим образом, в ней показатели NVMe-oF поделены на iSER.

Raid0, NVMe-oF vs iSER

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 ему не было послаблений в лице более жирной ВМ.-Источник
|