Fingerprintování virtuálního procesoru
Tento příběh začal jednoho horkého letního večera, kdy jsem se rozhodl vyzkoušet ultra-levnou VPS v ceně pod kilo za měsíc. Konkrétně jsem risknul to nejlacinější, co nabízí hukot.net za 90 korun per měsíc.
Nečekal jsem moc, ale přesto jsem byl překvapený. /proc/cpuinfo
ukázal, že z myriády x86 rozšíření server nabízí maximálně SSE2 uvedené v roce 2000
spolu s nechvalně proslaveným Pentiem 4. To není nic, s čím bych se v roce 2022 zrovna chlubil. A poskytovatel serveru se nechlubí. Na webu píše, že
prioritně používají Zen, Zen 2 a Xeon Silver1 procesory.
Tohle asi nebude jeden z nich. Kdyby ano, museli by ho doslova vykostit. Žádné
AVX, popcnt, AES, BMI, dokonce ani stařičké SSE4.2 (a s ním instrukce
pcmpistrm
, k níž jsem si vybudoval nezdravý vztah). Šlo by o degradaci
x86 ISA o celé dvě dekády.
Tak co jim tam ve skutečnosti běží? Hypervizor může virtuálnímu stroji lhát, jak se mu jen zlíbí. Nemůžu si být jistý tím, co o sobě počítač říká. Jsou to jen lži a propaganda. Věřit můžu jen tomu, co skutečně dělá. A v tomhle případě mám štěstí. Rozdílné generace mikroarchitektur se chovají trochu jinak a tyto rozdíly můžeme pozorovat. Nejde jen o velké věci – velikosti cache a OOO struktur – i specifické instrukce se liší svou latencí a propustností.
Pro účely hrubého rozpoznání se hodí bswap
. Podle Agnera se na čipech
Intelu chová dostatečně odlišně od nejnovějšího křemíku AMD. Zeny mají latence
a propustnosti stejné, nehledě na velikost operandu. Na Intelu vykazují 64 bit
operandy 2× horší latenci a propustnost, než je tomu v případě 32bitových.
Vyzbrojen touto znalostí můžu sestrojit 2 maličké programy pro testování
klíčových metrik. Test latence volá bswap
na jednom registru — výstup
instrukce je vstupem následující a program je tím pádem serializovaný a limitován na IPC 1. Smyčka je dostatečně odrolována, aby režie dekrementace &
skoku byla malá a co nejméně kontaminovala výsledky.
mov $200000000, %rax loop: bswap %r8 bswap %r8 bswap %r8 bswap %r8 bswap %r8 bswap %r8 bswap %r8 bswap %r8 dec %rax jnz loop
Jako test propustnosti poslouží série bswap
ů na různých registrech, tady r8 – r15. CPU má volné ruce jich najednou spustit až 8 a program je limitován
jen tím, kolik bswap
instrukcí procesor dokáže rozjet v každém taktu.
(Navíc pokud v jedné iteraci provedu dva bswap
y na každém registru, ten se
vrátí na původní hodnotu. To má příjemný bonus, že můžu použít jakýkoli
registr, se mi zlíbí, a nemusím se učit konvence x86 volání a pravidla o tom, kdo
musí uložit jaký registr.)
mov $200000000, %rax loop: bswap %r8 bswap %r9 bswap %r10 bswap %r11 bswap %r12 bswap %r13 bswap %r14 bswap %r15 dec %rax jnz loop
Stačí měřit jen relativní časy. Není potřeba znát počet
taktů a instrukcí z perf
u (virtuální stroj je stejně nenabízí).
Výsledky jsou následující.
Nejprve můj Intelí Haswell pro ověření hypotézy:
latence | propustnost | |
32b | 0.45 s | 0.23 s |
64b | 0.9 s | 0.45 s |
A teď onen neznámý procesor:
latence | propustnost | |
32b | 0.7 s | 1.2 s |
64b | 2.2 s | 1.2 s |
Tohle jsem nečekal. Propustnost stejná nehledě na 32/64 bit operandy jako u AMD, ale
latence se nečekaně propadne 3× pro 64 bitů.
Je na čase si zas projít Agnerovy instrukční tabulky a podívat se, jak je na
tom bswap
.
(Propustnost se udávaná jako inverzní hodnota a pak platí, stejně jako pro latenci, že menší je lepší. 0.25 značí 4 instrukce každý takt.)
lat. prop. Zen 3: 1 0.25 Zen 2: 1 0.3 Zen 1: 1 0.25 Icelake, Cannon Lake, Coffee Lake, SkylakeX, Skylake, Broadwell, Haswell: 32b 1 0.5 64b 2 1 Ivy Bridge, Sandy Bridge: 32b 1 1 64b 2 1 Nehalem: 32b 1 1 64b 3 1
Chování odpovídá Nehalemu. Propustnost stejná pro obě šířky operandu, latence trojitá pro 64b registry. Ne zrovna, co bych čekal, musím říct. Nehalem představuje to nejlepší, co mohl rok 2008 nabídnout. Dva tisíce osm. Čtrnáct let nazpátek.
Tak to bychom měli. Teď zbývá jen jediná otázka: Je devadesát korun českých přiměřená částka za jedno jádro čtrnáct let staré mikroarchitektury? Pokud ne, vyhněte se nabídce hukot.net.
- Chlubit se použitím Xeonu Silver je k ničemu. Jde o marketingové jméno a nic neříká o použité generaci mikroarchitektury. Pokrývá všechno od Skylake po Ice Lake.