提问人:user5016380 提问时间:7/11/2023 更新时间:7/11/2023 访问量:185
不同的 CPU 功能
Different CPU capabilities
问:
cpu 功能从哪里暴露给 libvirt VM?我们能够从不同的来源看到不同的 cpu 功能。我们创建了一个具有 cpu 模式“host-passthrough”的 VM,该 VM 未获取物理节点 lscpu 标志中显示的所有标志。为什么 /usr/share/libvirt/cpu_map/ 和 “virsh capabilities” 中有不同的 cpu 标志集
标志计数为 133
root@physical_node:~# lscpu |grep 标志 标志: 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 art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 监视器 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 3dNowPrefetch cpuid_fault EPB cat_l3 cdp_l3 invpcid_single intel_ppin SSBD MBA IBRS IBPB STIBP ibrs_enhanced tpr_shadow VNMI FlexPriority EPT VPID FSGSBoS tsc_adjust BMI1 AVX2 SMEP BMI2 ERMS InvpcID CQM MPX rdt_a AVX512F AVX512DQ RDSEED ADX Smap CLFLUSHOPT CLWB intel_pt AVX512CD AVX512BW AVX512VL XSAVEOPT XSAVEC XGETBV1 XSAVES cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_localDtherm ida arat pln pts PKU ospke avx512_vnni md_clear flush_l1d arch_capabilities
标志计数为 72
root@physical_node:~# grep -oP “(?<=feature name=['”]).*(?=['“])” /usr/share/libvirt/cpu_map/x86_Cascadelake-Server-noTSX.xml |xargs 3dnowprefetch abm adx aes apic arat avx avx2 avx512bw avx512cd avx512dq avx512f avx512vl avx512vnni bmi1 bmi2 clflush clflushopt clwb cmov cx16 cx8 de erms f16c fma fpu fsgsbase fxsr invpcid lahf_lm lm mca mce mmx movbe mpx msr mtrr nx pae pat pcid pclmuldq pdpe1gb pge pni popcnt pse pse36 rdrand rdseed rdtscp sep smap smep spec-ctrl ssbd sse sse2 sse4.1 sse4.2 ssse3 syscall tsc tsc-deadline vme x2apic xgetbv1 xsave xsavec xsaveopt
标志计数为 35
root@physical_node:~# virsh 能力 DS ACPI SS HT TM PBE DTes64 监视器 ds_cpl VMX SMX EST TM2 XTPR PDCM DCA OSXSAVE tsc_adjust CMT INTEL-PT PKU OSPKE MD-CLEAR STIBP arch-capabilities xsaves mbm_total mbm_local invtsc rdctl-no ibrs-all skip-l1dfl-vmentry mds-no pschange-mc-no tsx-ctrl
使用
在 vm 中,标志计数为 99。
root@vm-1:~# lscpu |grep 标志 标志: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good nopl xtopology cpuid tsc_known_freq pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch cpuid_fault invpcid_single ssbd ibrs ibpbSTIBP ibrs_enhanced tpr_shadow vnmi flexpriority ept VPID ept_ad fsgsbase tsc_adjust BMI1 AVX2 SMEP BMI2 ERMS invpcid mpx avx512f avx512dq rdseed adx smap clflushopt clwb avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves arat pku ospke avx512_vnni md_clear arch_capabilities
想知道以便我更好地理解。
答:
准备好听听可怕的艰辛、忍耐和悲惨的故事......
QEMU 和 libvirt 中的 CPU 处理相当复杂,不明显,并且带有误导人们的历史包袱。
主机上的命令准确报告主机操作系统能够从实际 CPU 中看到的内容。lscpu
QEMU CPU 模型旨在通过主机 CPU 的所有功能,但实际上这并不是一门精确的科学。有些功能是不可虚拟的,或者被 KVM 内核模块故意阻止,因此不会出现在客户机中。有些功能可以暴露给客人,即使主人没有它们。因此,QEMU 中的 CPU 模型将为您提供一个非常接近主机上告诉您的客户机,但可能仍有一小部分差异。host-passthrough
host-passthrough
lscpu
XML 文件仅在使用命名 CPU 模型时才相关,而不是 .这些文件定义了 libvirt 对 QEMU 最初如何对每个命名 CPU 进行建模的视图。问题在于,QEMU 对命名 CPU 的看法会随着时间的推移而变化,要么是因为在 QEMU 的定义中发现了错误,要么是因为硬件供应商发布了添加/删除标志的微码更新。对于现代版本的 QEMU,在运行 guest 时不再使用这些 XML 文件中列出的功能集,而是 libvirt 将与 QEMU 对话以发现完整的 up2date 功能集。因此,您在这些 XML 文件中看到的功能集几乎总是与来宾看到的不同。/usr/share/libvirt/cpu_map/
host-passthrough
但是,当您运行 时,XML 文件中的功能仍会被使用。对于此命令,libvirt 将查看主机 CPU,并尝试找到其命名的 CPU 之一,该 CPU 非常匹配。但是,报告的功能在主机上不会匹配,因为 libvirt 不会在该上下文中扩展完整的功能集。如果报告,它只会列出 libvirt 的文件和您的实际主机之间不同的功能。要查看应与主机匹配的完整功能集,需要告诉 libvirt 使用 展开功能列表。如果您想查看与来宾匹配的完整功能集,则需要virsh capabilities
virsh capbilities
lscpu
virsh capabilities
CascadeLake
CascadeLake.xml
lscpu
virsh baseline-cpu --features
lscpu
virsh hypervisor-cpu-baseline --features
例如
virsh capabilities --xpath //host/cpu > host-cpu.xml
virsh cpu-baseline -features host-cpu.xml > expanded-host-cpu.xml
virsh hypervisor-cpu-baseline -features host-cpu.xml > expanded-guest-cpu.xml
即使你这样做了,设置仍然可能不完全匹配,因为即使使用某些功能也可能被故意跳过,因为它们会阻止迁移。guest-cpu.xml
lscpu
host-passthrough
最后,“lscpu”命令对某些功能使用的名称与 libvirt 和 QEMU 不同,这使得比较变得“有趣”。
总的来说,信息是比较所有这些不同来源之间的功能是非常痛苦和令人困惑的:-(
评论