Предисловие скопировано из 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
ВМ: Ubuntu 24.04 (6.11.0-26)
ZFS: 2.4.0
Схема подключения для тестов 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
Случайное 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
Случайное 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
Случайное 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
Конфигурация 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
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
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
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
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
Настройки хоста со стороны 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 = <conntectX-4 pcie ID из lspci>
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 = <max CPU TDP>
PPT Control = Manual
PPT = <max CPU TDP>
Для наглядности 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
(назад к оглавлению)
(назад к описанию теста)


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

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

3.11.2 Raid5

4. NVMe-oF
4.1 Проблемы Next-Next-Next для NVMe-oF
При простом включении NVMe-oF (включая настройки тут, тут и тут) и 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
(назад к оглавлению)
(назад к описанию теста)


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

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

4.7 VDbench - 8k - 80% rng - 75/25 r/w
(назад к оглавлению)
(назад к описанию теста)


4.8 FIO - 256k - 0% rng - 0/100 r/w
(назад к оглавлению)
(назад к описанию теста)

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

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 Raid 0

4.12.2 Raid 5

Вывод
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.


В столбце 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 ему не было послаблений в лице более жирной ВМ.
5) Update 1. ZFS compression
Относительно ZFS и оставленной компрессии по умолчанию:
Отключение компрессии привело к следующим результатам, которые ложатся в 5% погрешность для большей части тестов по IOPS и latency, а вот по CPU load выигрыш получился приличный для последовательного записи и чтения в тестах FIO, где генерируемые данные имели параметр buffer_compress_percentage=50. В таблице сооветственно значения ZFS noLZ4 делённые на ZFS lz4 (табличные данные приведены в общей таблице) при подключение через iSER.
