libvirt cpu-mode='host-model' 在映射 cpu 模型时混淆?
libvirt cpu-mode='host-model' confuses while mapping cpu models?
我的物理主机有 cpu 型号 'Intel(R) Xeon(R) CPU E5-2670 v3 @ 2.30GHz' 并且它在 cpu 信息中有 'avx2' 标志。主机配置了 kvm/qemu 管理程序和 libvirt。我将 cpu 模式设置为域 XML 中的主机模型。可以在主机上创建来宾虚拟机。当我检查来宾虚拟机的 cpu 模型时,它显示为 'SandyBridge' 并且它在 cpu 信息中也有 'avx2' 标志。但是 'SandyBridge' 不支持 'avx2' 标志,但 'Haswell' 模型支持。这只是由于主机模型模式,libvirt 找到最接近 'Intel(R) Xeon(R) CPU E5-2670 v3 @ 2.30GHz' 的 cpu 模型作为 'SandyBridge',但它应该显示 'Haswell'。这是否意味着 libvirt 有错误或者它在这种情况下是有效的表示?我正在使用 libvirt 版本 1.2.2
在特定的芯片世代(SandyBridge、Haswell 等)中,英特尔实际上并不保证它制造的所有不同型号都具有相同的 CPU 标志。我们可以在 Haswell 或更高版本中看到这一点,其中一些 CPU 具有 TSX 功能,而另一些则没有。 QEMU/libvirt 通常只为每一代英特尔提供单一模型,因此您的物理 CPU 可能实际上与相应命名的 QEMU 模型不兼容。
从 libvirt POV 来看,这些名称只是一组特定功能的快捷方式。因此,在为 "host-model" 识别 CPU 时,libvirt 完全忽略名称,只查找其功能列表与您的主机 CPU 最密切相关的 CPU,然后在 XML 中明确列出任何额外的 CPU 特征。所以这一切意味着,即使您将 Haswell 作为物理 CPU,libvirt 也完全有可能为您的客户机显示不同的模型名称。从一个功能性的 POV 来看,这并没有什么错——所有的功能都应该存在(除了一些 KVM 有意阻止的功能),只是有点 "surprising" 需要看。
在你的情况下,我认为这是由于英特尔 TSX 支持中的错误。此功能在 Haswell 中引入,但在英特尔发现它被破坏后在微代码更新中被阻止。这会导致 'tsx' 功能从您物理机的 CPU 型号中消失。 libvirt/QEMU Haswell CPU 模型仍然包含 'tsx',因此这意味着 libvirt 不会与您的 Haswell CPU 相匹配。在 libvirt >= 1.2.14 中,我们引入了一个新的 Haswell-noTSX CPU 模型来处理这个特殊问题,但你说你只有 1.2.2。 SandyBridge 只是 libvirt 可以为您找到的下一个最佳兼容 CPU 模型。
我找到了另一个不需要升级 libvirt 的解决方法。我从 libvirt (/usr/share/libvirt/cpu_map.xml) 使用的 cpu 映射 xml 文件中的 Haswell 定义中删除了 hle 和 rtm 标志。然后我重新启动了 libvirt 进程。然后我重新启动了 VM,它显示正确的型号名称为 Haswell。
我的物理主机有 cpu 型号 'Intel(R) Xeon(R) CPU E5-2670 v3 @ 2.30GHz' 并且它在 cpu 信息中有 'avx2' 标志。主机配置了 kvm/qemu 管理程序和 libvirt。我将 cpu 模式设置为域 XML 中的主机模型。可以在主机上创建来宾虚拟机。当我检查来宾虚拟机的 cpu 模型时,它显示为 'SandyBridge' 并且它在 cpu 信息中也有 'avx2' 标志。但是 'SandyBridge' 不支持 'avx2' 标志,但 'Haswell' 模型支持。这只是由于主机模型模式,libvirt 找到最接近 'Intel(R) Xeon(R) CPU E5-2670 v3 @ 2.30GHz' 的 cpu 模型作为 'SandyBridge',但它应该显示 'Haswell'。这是否意味着 libvirt 有错误或者它在这种情况下是有效的表示?我正在使用 libvirt 版本 1.2.2
在特定的芯片世代(SandyBridge、Haswell 等)中,英特尔实际上并不保证它制造的所有不同型号都具有相同的 CPU 标志。我们可以在 Haswell 或更高版本中看到这一点,其中一些 CPU 具有 TSX 功能,而另一些则没有。 QEMU/libvirt 通常只为每一代英特尔提供单一模型,因此您的物理 CPU 可能实际上与相应命名的 QEMU 模型不兼容。
从 libvirt POV 来看,这些名称只是一组特定功能的快捷方式。因此,在为 "host-model" 识别 CPU 时,libvirt 完全忽略名称,只查找其功能列表与您的主机 CPU 最密切相关的 CPU,然后在 XML 中明确列出任何额外的 CPU 特征。所以这一切意味着,即使您将 Haswell 作为物理 CPU,libvirt 也完全有可能为您的客户机显示不同的模型名称。从一个功能性的 POV 来看,这并没有什么错——所有的功能都应该存在(除了一些 KVM 有意阻止的功能),只是有点 "surprising" 需要看。
在你的情况下,我认为这是由于英特尔 TSX 支持中的错误。此功能在 Haswell 中引入,但在英特尔发现它被破坏后在微代码更新中被阻止。这会导致 'tsx' 功能从您物理机的 CPU 型号中消失。 libvirt/QEMU Haswell CPU 模型仍然包含 'tsx',因此这意味着 libvirt 不会与您的 Haswell CPU 相匹配。在 libvirt >= 1.2.14 中,我们引入了一个新的 Haswell-noTSX CPU 模型来处理这个特殊问题,但你说你只有 1.2.2。 SandyBridge 只是 libvirt 可以为您找到的下一个最佳兼容 CPU 模型。
我找到了另一个不需要升级 libvirt 的解决方法。我从 libvirt (/usr/share/libvirt/cpu_map.xml) 使用的 cpu 映射 xml 文件中的 Haswell 定义中删除了 hle 和 rtm 标志。然后我重新启动了 libvirt 进程。然后我重新启动了 VM,它显示正确的型号名称为 Haswell。