干货分享:OpenStack中的虚拟机CPU架构

 

计算机最主要的生产力为计算能力,而计算机的计算能力取决于CPU性能,CPU性能又与CPU的架构有关系。...





计算机最主要的生产力为计算能力,而计算机的计算能力取决于CPU性能,CPU性能又与CPU的架构有关系。CPU的架构能够决定一个CPU的性能高低和能够使用到的特性。在CPU相同主频的情况下Hasewell架构的CPU比IvyBridge架构的CPU性能高。

在虚拟化的背景下,CPU的虚拟化技术能够将单颗物理CPU模拟为多个虚拟机CPU运行。目前主流CPU硬件辅助虚拟化技术为Intel VT-X和AMD-V两种。其原理为通过引入新的指令和运行模式,使VMM和Guest OS分别运行在不同模式(ROOT 模式和非ROOT模式)下,且Guest OS 运行在Ring 0 下。


CPU中包含的指令
通常情况下,Guest OS 的核心指令可以直接下达到计算机系统硬件执行,而不需要经过VMM。当Guest OS执行到特殊指令的时候,系统会切换到VMM,让VMM来处理特殊指令。GuestOS负责第2级调度,即线程或进程在VCPU上的调度(将核心线程映射到相应的虚拟CPU上。)

VMM(Virtual Machine Monitor)负责第1级调度,即VCPU在物理处理单元上的调度。

两级调度的调度策略和机制不存在依赖关系。VMM负责物理处理器资源在各个虚拟机之间的分配和调度,本质上即把各个虚拟机中的VCPU按照一定的策略和机制调度在物理处理单元上,可以采用任意的策略来分配物理资源,满足虚拟机的不同需求。
VMM


在较大的OpenStack环境中,可能存在多种不同的CPU的服务器。这就导致了OpenStack计算节点的计算能力与特性不同,从而带来的问题是

  1. 不同架构CPU服务器之间无法进行热迁移
  2. 无法统一虚拟机的性能


为了解决以上的问题,我们可以通过将CPU架构暴露给KVM虚拟机,来解决该问题。

在libvirt中通过提供基本CPU型号名称,一组附加功能标志和拓扑(插槽/核心/线程)来指定CPU。 libvirtKVM驱动程序提供了许多标准CPU型号名称(在/usr/share/libvirt/cpu_map.xml中定义)

“486”,“pentium”,“pentium2”,“pentiumpro”,“coreduo”,“n270”,“pentiumpro”,“qemu32”,“kvm32”,“cpu64-rhel5”,“cpu64-rhel5”,“kvm64 “Opteron_G3”,“Opteron_G3”,“Opteron_G3”,“Opteron_G3”,“Opteron_G3”,“Opteron_G4”,“Pentiumpro”,“Conroe”“Penryn”,“Nehalem”,“Westmere”,“pentiumpro”,“cpu64-rhel5”,“cpu64-rhel5””

还有两种方式获取物理机的CPU模型

  • host-model” - 这将使libvirt从上面的列表中识别与主机最匹配的命名CPU模型,然后请求额外的CPU标志来完成匹配。 这将接近最大的功能/性能,如果迁移到具有略微不同的主机CPU的另一个主机,这将保持良好的可靠性/兼容性。 注意 ,由于libvirt检测主机CPU的方式,使用主机模型创建的CPU配置可能无法正常工作。 客户机CPU可能通过使用不起作用的CPU功能和其他参数(例如CPUID级别)的组合来混淆客户机操作系统(甚至导致内核崩溃)。
  • host-passthrough” - 这将使libvirt配置KVM直接获取主机CPU。 与host-model 不同,host-passthrough不仅仅匹配功能标志,还匹配主机CPU的每个最后的细节。 这将给出最大化的性能,并且对于需要检查低级CPU细节的一些应用程序可能更重要。但是虚拟机只能在完全匹配的主机CPU之间迁移。
可以通过使用virshcapabilities命令查看现在QEMU/KVM使用的CPU架构和特性
在OpenStack中调整CPU架构,在nova的配置文件中修改以下内容。

[libvirt]



cpu_mode = None

cpu_model = None



配置项
内容
cpu_mode
(String)用于设置实例使用的CPU模式。

如果virt_type =“kvm |qemu”,它将默认为“host-model”,否则默认为“none”。

可用的值:

host-model:克隆主机CPU功能标志。

host-passthrough:使用主机CPU型号;

custom:使用命名的CPU模型;

none:不设置任何CPU模型。

相关选项:

cpu_model:如果使用cpu_mode,请设置此配置选项,否则这将导致错误,实例将无法启动。cpu_model
(String)设置实例使用的libvirtCPU模型的名称。

可用的值:

/usr/share/libvirt/cpu_map.xml中列出的名称

相关选项:

cpu_mode:当cpu_mode未设置为custom时,不要设置此值。这将导致错误,并且实例将无法启动。

virt_type:只有虚拟化类型kvm和qemu需要使用它。
原创文章,转载请务必在文首注明转自“九州云99Cloud”及原作者,谢谢配合~




更多精彩内容请点击“阅读原文”


    关注 九州云99Cloud


微信扫一扫关注公众号

0 个评论

要回复文章请先登录注册