CPU features/flags - host vs. guest (KVM/Libvirt/QEMU)

CPU features/flags - host vs. guest (KVM/Libvirt/QEMU)
« kdy: 06. 09. 2022, 00:18:47 »
Zdravím,

  nevíte někdo o nějakém přehledu, tabulce (ideálně co nejvíc aktuální) s jednotlivými CPU features/flags pro x86_64 (prioritně Intel), ve kterém by bylo uvedeno:
  • popis jednotlivých features/flags
  • závislosti mezi jednotlivými features/flags - např. avx na xsave
  • jaké features/flags se kontrolují na hypervizoru (host), ale nepropagují se do guesta - např. acpi, ds, monitor, pbe, tm atd. - některé vymaskuje/zakáže [(ne)jsou podporovány] Libvirt, jiné zase KVM/QEMU
  • jaké features/flags aktivní u guesta omezují určité chování/možnosti virtualizace jako třeba live migraci - např. invtsc, xsaves
  • zatím jsem našel jen https://github.com/libvirt/libvirt/blob/master/src/cpu_map/x86_features.xml - feature s migratable='no'
Chtěl bych vyladiť konfiguraci CPU pro virtuální servery, tzn. zvolit základní CPU model a zapnout/vypnout potřebné či vhodné features/flags při zachování možnosti live migrace. Unikají mi ale výše uvedené souvislosti, protože ne všechny uvedené features v rámci cpu elementu v definici VM (domény v Libvirtu) jsou pak vidět uvnitř VM v /proc/cpuinfo. Samozřejmě vím o dalších souvisejících příkazech, registrech atd. jako "virsh capabilities", MSR, fixech v mikrokódu CPU, host-model či host-passthrough CPU...

Předem díky


RDa

  • *****
  • 2 467
    • Zobrazit profil
    • E-mail
Re:CPU features/flags - host vs. guest (KVM/Libvirt/QEMU)
« Odpověď #1 kdy: 06. 09. 2022, 16:48:10 »
Bud pouzij homogenni server pool, a pokud to nejde, tak si zjisti co mas nejhorsi zelezo a podle toho nakonfiguruj ty ostatni systemy.

Co jsi nezminil je, zda se nektere featury daji zapnout nad ramec hosta, ze by to pak bezelo v emulaci.. ktera bude mit velikej vykonnostni dopad. Nebo je guest vzdy subset z hosta pri "hw virtualizaci" ?

Re:CPU features/flags - host vs. guest (KVM/Libvirt/QEMU)
« Odpověď #2 kdy: 07. 09. 2022, 06:10:48 »
Citace
Bud pouzij homogenni server pool, a pokud to nejde, tak si zjisti co mas nejhorsi zelezo a podle toho nakonfiguruj ty ostatni systemy.

jj, tohle je mi jasný, viz virsh cpu-baseline a virsh cpu-compare

Citace
Co jsi nezminil je, zda se nektere featury daji zapnout nad ramec hosta, ze by to pak bezelo v emulaci.. ktera bude mit velikej vykonnostni dopad. Nebo je guest vzdy subset z hosta pri "hw virtualizaci" ?

ano, dle dokumentace k Libvirtu by měly jit zapnout i featury, které se pak emulují, ale popravdě, jak se toto nastavuje/povoluje jsem ještě z dokumentace ne zcela pochopil... nyní řeším jen subset features z hosta do guesta

To co mi přijde skvělé a zároveň matoucí/zavádějící je to, že pro kontrolu features/flags host (fyzického) CPU a nastavení features/flags CPU guesta (virtuálního) se používají ty samé konfigurační elementy.

Při konfiguraci CPU si mohu vybrat z předdefinovaných obecných CPU modelů, u kterých je pak případně potřeba pozapínat další features, hlavně ty spojené s Meltdown/Spectre apod. Když vyberu host-model CPU, tak Libvirt automaticky vybere nejpodobnější obecný CPU model a automagicky pozapíná další features podporované hostitelským CPU včetně "ochran" pro Meltdown/Spectre apod. a pak ještě komunikuje s daným qemu-kvm procesem a upravuje definici CPU běžícího VM, podle toho, jak se to qemu-kvm podařio spustit... režim CPU host-passthrough jsem zatím nezkoušel, protože chci zachovat možnost live migrace.

Problém je v tom, že podpora pro dané features/flags musí lícovat mezi Libvirt a QEMU/KVM - když uvedu vybrané CPU features/flags v konfiguraci VM v Libvirtu a ten je pak předá QEMU/KVM, tak to ještě neznamená, že budou dostupné ve virtuálním CPU ve spuštěném VM ač je i hostitelské (fyzické) CPU podporuje. Některá CPU features/flags závisí na jiných, např. nemá cenu zapínat avx bez xsave (možná ani neprojde pokus o nastavení v konfiguráku, nezkoušel jsem), jiná zase nejsou vhodné ve spojení s live migrací.

Určitého souladu mezi Libvirtem a QEMU/KVM se dá asi docílit vhodnou kombinací atributů match, check a fallback.

Proto se ptám po nějakém přehledu/tabulce, ze kterého by to bylo jednoduše odvoditelné. Obávám se, ale že mi nezbude nic jiného, než se tou magickou autokonfigurací prokousat ve zdrojácích Libvirtu a QEMU/KVM.


Uvedu příklad:

- flags fyzického CPU - Intel(R) Xeon(R) CPU E5-2620v3:
Kód: [Vybrat]
fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm epb invpcid_single ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm xsaveopt cqm_llc cqm_occup_llc dtherm ida arat pln pts md_clear spec_ctrl intel_stibp flush_l1d

- features virtuálního CPU z Libvirtu:
Kód: [Vybrat]
<cpu mode='custom' match='exact' check='partial'>
  <model fallback='allow'>Haswell-IBRS</model>
  <vendor>Intel</vendor>
  <feature policy='require' name='vme'/>
  <feature policy='require' name='ds'/>
  <feature policy='require' name='acpi'/>
  <feature policy='require' name='ss'/>
  <feature policy='require' name='ht'/>
  <feature policy='require' name='tm'/>
  <feature policy='require' name='pbe'/>
  <feature policy='require' name='dtes64'/>
  <feature policy='require' name='monitor'/>
  <feature policy='require' name='ds_cpl'/>
  <feature policy='require' name='vmx'/>
  <feature policy='require' name='smx'/>
  <feature policy='require' name='est'/>
  <feature policy='require' name='tm2'/>
  <feature policy='require' name='xtpr'/>
  <feature policy='require' name='pdcm'/>
  <feature policy='require' name='dca'/>
  <feature policy='require' name='osxsave'/>
  <feature policy='require' name='f16c'/>
  <feature policy='require' name='rdrand'/>
  <feature policy='require' name='arat'/>
  <feature policy='require' name='tsc_adjust'/>
  <feature policy='require' name='md-clear'/>
  <feature policy='require' name='stibp'/>
  <feature policy='require' name='ssbd'/>
  <feature policy='require' name='xsaveopt'/>
  <feature policy='require' name='pdpe1gb'/>
  <feature policy='require' name='abm'/>
  <feature policy='disable' name='hle'/>
  <feature policy='disable' name='rtm'/>
  <feature policy='require' name='hypervisor'/>
</cpu>

- odpovídající parametry pro qemu-kvm (navíc je pseudo flag check) - po spustění přes libvirt:
Kód: [Vybrat]
# /usr/libexec/qemu-kvm -name centos7.0 -S -machine pc-i440fx-rhel7.0.0,accel=kvm -cpu Haswell-IBRS,+vme,+ds,+acpi,+ss,+ht,+tm,+pbe,+dtes64,+monitor,+ds_cpl,+vmx,+smx,+est,+tm2,+xtpr,+pdcm,+dca,+osxsave,+f16c,+rdrand,+arat,+tsc_adjust,+md-clear,+stibp,+ssbd,+xsaveopt,+pdpe1gb,+abm,-hle,-rtm,check -m 1024 ...
CPU feature arat not found
CPU feature tsc_adjust not found
warning: host doesn't support requested feature: CPUID.01H:EDX.ds [bit 21]
warning: host doesn't support requested feature: CPUID.01H:EDX.acpi [bit 22]
warning: host doesn't support requested feature: CPUID.01H:EDX.ht [bit 28]
warning: host doesn't support requested feature: CPUID.01H:EDX.tm [bit 29]
warning: host doesn't support requested feature: CPUID.01H:EDX.pbe [bit 31]
warning: host doesn't support requested feature: CPUID.01H:ECX.dtes64 [bit 2]
warning: host doesn't support requested feature: CPUID.01H:ECX.monitor [bit 3]
warning: host doesn't support requested feature: CPUID.01H:ECX.ds_cpl [bit 4]
warning: host doesn't support requested feature: CPUID.01H:ECX.vmx [bit 5]
warning: host doesn't support requested feature: CPUID.01H:ECX.smx [bit 6]
warning: host doesn't support requested feature: CPUID.01H:ECX.est [bit 7]
warning: host doesn't support requested feature: CPUID.01H:ECX.tm2 [bit 8]
warning: host doesn't support requested feature: CPUID.01H:ECX.xtpr [bit 14]
warning: host doesn't support requested feature: CPUID.01H:ECX.pdcm [bit 15]
warning: host doesn't support requested feature: CPUID.01H:ECX.dca [bit 18]
warning: host doesn't support requested feature: CPUID.01H:ECX.osxsave [bit 27]
- ač je ve warningu uvedeno "host doesn't support..." dle mne je tím myšleno guest
  ... tyto flagy pak nejsou uvedeny u virtuálního CPU