Servery
SPDK & Kazan Onyx limity a proxy
Jak jsme vyřešili limity Kazan Onyx2 pomocí vlastní SPDK proxy vrstvyV 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ámeNež se dostaneme k samotné proxy, krátce připomeňme technologii.Onyx2 = FPGA NVMe-oF target engineKazan 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árFPGA 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“ proxyPotř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 – architekturaVý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šitNasazení 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 multipathHypervisory 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 konfiguraceProxy 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í latenceProxy 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 produkciPo nasazení SPDK proxy jsme získali několik klíčových výhod:1) Žádné limity NVMe controllerů na hypervisoryHypervisory 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í multipathEUI64 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 FPGAVš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žiePřidání ~10 μs latence je naprosto zanedbatelné vzhledem k počtu hypervisorů, které obsluhujeme, a získané flexibilitě.5) Jednodušší upgrade / rolling updatesProxy můžeme restartovat nebo nahrazovat bez potřeby šahat na samotné storage chassis. Hypervisory cílí na stabilní endpointy, které kontrolujeme my.ZávěrTí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.
READ_TIME_MANY




