SPDK & Kazan Onyx limity a proxy
16. november 2025 2:29
Jak jsme vyřešili limity Kazan Onyx2 pomocí vlastní SPDK proxy vrstvy
V jednom z našich předchozích článků jsme detailně popisovali, jak fungují naše NVMe JBOF storage boxy postavené na HPE J2000 a FPGA akcelerátorech Kazan Onyx2 (dnes Western Digital). Psali jsme o tom, jaká je reálná latence, jak Onyx2 mapuje NVMe namespace přímo přes PCIe do NVMe-oF a jak se nám podařilo tyto jednotky rozchodit jako jeden z nejrychlejších storage backendů v naší infrastruktuře.
Tentokrát navážeme tam, kde jsme tehdy skončili. Při dalším rozšiřování jsme totiž narazili na problém, který není na první pohled vidět – limit počtu NVMe controllerů na FPGA.
A tento detail nakonec vedl k tomu, že jsme implementovali vlastní SPDK proxy vrstvu mezi hypervisory a J2000 storage. A změnilo to způsob, jak náš NVMe-oF storage cluster škálujeme.
Proč Kazan Onyx2 na J2000 vůbec používáme
Než se dostaneme k samotné proxy, krátce připomeňme technologii.
Onyx2 = FPGA NVMe-oF target engine
Kazan Onyx2 není síťová karta ani DPU. Je to specializovaná FPGA pipeline, která implementuje NVMe over Fabrics:
- čtení a zápisy jdou přímo z RDMA/TCP do DMA enginů FPGA,
- žádný kernel, žádné CPU, žádný kontext switch,
- ultra-nízká latence díky hardwarovému fast-pathu,
- deterministické chování bez jitteru,
- prakticky line-rate výkon i v QD=1.
Onyx2 je tedy čistá NVMe-oF hardwarová brána mezi síťovým provozem a fyzickými NVMe disky.
HPE J2000 + 6× Kazan Onyx2 (dual-path)
V našich J2000 chassisech máme typicky:
- 24 NVMe disků,
- 6× Onyx2 karet,
- dual-path topologii (A/B redundantní porty),
- plnou podporu multipathu.
Tento design se nám osvědčil – výborná latence, spolehlivost, velmi slušná efektivita.
Jenže…
Našli jsme limit, který nás zastavil: 32 NVMe controllerů na FPGA pár
FPGA Onyx2 implementuje vlastní interní NVMe-oF target. A ten target má pevně definovaný limit:
Maximálně 32 NVMe controllerů na jeden FPGA pár (A/B).
Reálně to znamená:
- 32 controllerů na port A,
- 32 controllerů na port B,
- pokud potřebujeme více, není jak.
A zde jsme narazili.
Protože:
- J2000 máme zapojené redundantně přes dual path,
- v jednom boxu je 6 Onyx2 karet,
- hypervisorů máme v cloud klastru výrazně více než 32.
Navíc každý hypervisor si zakládá vlastní NVMe-oF controller session pro multipath. To znamená, že při větším počtu hypervisorů se 32 controllerů vyčerpá velmi rychle.
Pro výkon to nebyl problém. Pro kapacitu taky ne. Ale škálovat se s tím prostě nedalo.
Řešení? Vložit mezi hypervisor a storage „chytrou“ proxy
Potřebovali jsme něco, co bude:
- na straně Kazanu fungovat jako NVMe initiator,
- na straně hypervisorů jako NVMe-oF target,
- bude umět zachovat identitu disků (EUI64/NGUID),
- bude přidávat minimum latence,
- a nebude mít limit 32 controllerů.
A přesně to poskytl SPDK.
SPDK Proxy – architektura
Výsledná architektura vypadá zjednodušeně takto:
Hypervisor → NVMe-oF Initiator → SPDK Proxy → SPDK NVMe Initiator → Kazan Onyx2 → NVMe diskSPDK proxy server tedy:
- naváže NVMe-oF spojení na Onyx2 FPGA (bdev_nvme initiator),
- připojí jednotlivé namespaces,
- vytvoří nad nimi vlastní SPDK blockdevy,
- a vystaví je dál jako SPDK NVMe-oF target.
Hypervisory už nekomunikují přímo s J2000, ale s proxy.
Co bylo potřeba upravit a vyřešit
Nasazení SPDK jako proxy není jen o spuštění nvmf_tgt. Museli jsme řešit několik poměrně hlubokých detailů.
1) EUI64/NGUID – kritická část pro multipath
Hypervisory očekávají, že:
- target A i target B budou hlásit stejný EUI64,
- a identifikátor musí odpovídat tomu, co hlásí původní NVMe namespace.
Kazan ale vrací EUI64 v jiném byte-order, než co vrací vlastní NVMe identify (a než očekává Linux).
Museli jsme tedy:
- patchnout SPDK,
- přidat EUI64 parsing do JSON výstupu,
- ručně správně poskládat EUI64 bajty podle NVMe specifikace,
- zaručit, že SPDK target bude exportovat stejnou identitu jako Onyx2 namespace.
Toto byla jedna z nejnáročnějších částí, protože multipath je na konzistenci identifikátorů extrémně citlivý.
2) Automatická regenerace SPDK konfigurace
Proxy musí po restartu:
- zjistit namespaces,
- načíst EUI64/NGUID,
- spustit NVMe initiator,
- vytvořit subsystémy,
- přidat namespace,
- nastavit controller-id range,
- spustit listener,
- a teprve potom povolit hypervisory.
Celé jsme to automatizovali vlastními skripty, které SPDK konfiguruje přes RPC. Díky tomu je start proxy deterministický a opakovatelný.
3) Hardware a ladění latence
Proxy server nesmí být bottleneck. Po testech jsme skončili u konfigurace založené na:
- AMD EPYC (kvůli vysokému single-core výkonu),
- ConnectX-5/6 Dx pro 100G RDMA/TCP,
- pinned cores: SPDK poll-loop běží na izolovaných jádrech,
- kernel parametrech typu:
idle=poll, nohz_full, isolcpus, rcu_nocbs, nosmt, default_hugepagesz=1G, hugepages=4, - IOMMU a hluboké C-states vypnuté.
Tím jsme dostali jitter pod ±3 μs a proxy přidávala pouze 8–12 μs navíc, což je v podstatě nerelevantní proti celkové latenci end-to-end.
Výsledky v produkci
Po nasazení SPDK proxy jsme získali několik klíčových výhod:
1) Žádné limity NVMe controllerů na hypervisory
Hypervisory teď komunikují jen s proxy, která se dokáže tvářit jako stovky controllerů. Kazan má pořád jen několik desítek – a to stačí.
2) Stabilní, konzistentní multipath
EUI64 i NGUID jsou konzistentní a identické napříč celou cestou. Linuxový NVMe driver tak nemá důvod hlásit chyby typu „IDs don't match for shared namespace“.
3) Nezávislost na implementaci NVMe-oF v FPGA
Všechny multipath a host-specific detaily běží v SPDK na serveru, ne ve firmware. Kazan Onyx2 zůstává tím, čím je nejlepší – extrémně rychlým NVMe-oF targetem.
4) Velmi nízká režie
Přidání ~10 μs latence je naprosto zanedbatelné vzhledem k počtu hypervisorů, které obsluhujeme, a získané flexibilitě.
5) Jednodušší upgrade / rolling updates
Proxy můžeme restartovat nebo nahrazovat bez potřeby šahat na samotné storage chassis. Hypervisory cílí na stabilní endpointy, které kontrolujeme my.
Závěr
Tím, že jsme mezi hypervisory a J2000 storage vložili SPDK proxy vrstvu, jsme vyřešili zásadní limit, který by jinak bránil dalšímu růstu celé platformy.
Kazan Onyx2 je stále perfektní backend – FPGA NVMe-oF target, který poskytuje konzistentní a extrémně nízkou latenci. SPDK pak doplňuje to, co FPGA hardware neumí: flexibilitu, kontrolu nad identitou disků, automatizaci a škálování.
Výsledkem je řešení, které kombinuje:
- hardwarovou latenci Kazanu,
- flexibilitu SPDK,
- robustní multipath,
- a škálovatelnou NVMe-oF topologii bez limitů FPGA.
Tato kombinace nám umožnila posunout storage infrastrukturu o generaci dál, připravit ji na vyšší počet hypervisorů a zároveň si zachovat náskok v I/O latencích, který považujeme za jednu z klíčových konkurenčních výhod.