当前位置: > 虚拟化 Virtualization > oVirt >

cpuflags,oVirt和vCPU功能

时间:2019-11-30 13:31来源:linux.it.net.cn 作者:IT
cpuflags,oVirt和vCPU功能
2017年7月31日

介绍
oVirt生态系统中有一个新的钩子:cpuflags。cpuflags挂钩是一个很小但很方便的功能,它允许对vCPU特性进行微调。更具体地说,oVirt用户和管理员现在可以选择向来宾操作系统公开哪些CPU标志。

libvirt和CPU模型
在深入研究钩子功能之前,了解libvirt CPU模型和功能是很重要的。如果您已经受过这一主题的教育,请随时跳过本章。

创建libvirt域时,它只是qemu命令行的XML表示形式,我们通常选择一个CPU模型。Libvirt CPU模型只是功能集-在CPUID指令中找到的CPU标志。有趣的是,CPUID实际上是x86_64特定的,并且在各种CPU功能上提供了大量的数据。其他体系结构(例如POWER8)不提供此类详细信息。因此,本文主要关注x86_64。那么我们能找到关于CPU的什么信息?为了避免遍历所有CPUID叶子,libvirt为/usr/share/libvirt/cpu_map.xml文件中的常用功能提供了EAX和EDX索引。

<span style="color:#515151"><code>$ cat /usr/share/libvirt/cpu_map.xml
<cpus>
  <arch name='x86'>
    <!-- vendor definitions -->
    <vendor name='Intel' string='GenuineIntel'/>
    <vendor name='AMD' string='AuthenticAMD'/>

    <!-- standard features, EDX -->
    <feature name='fpu'>
      <cpuid eax_in='0x01' edx='0x00000001'/>
    </feature>
    <feature name='vme'>
      <cpuid eax_in='0x01' edx='0x00000002'/>
    </feature>
    <feature name='de'>
      <cpuid eax_in='0x01' edx='0x00000004'/>
    </feature>
    <feature name='pse'>
      <cpuid eax_in='0x01' edx='0x00000008'/>
    </feature>
    <feature name='tsc'>
      <cpuid eax_in='0x01' edx='0x00000010'/>
    </feature>
    <feature name='msr'>
      <cpuid eax_in='0x01' edx='0x00000020'/>
    </feature>
    ...
</code></span>
通过遵循以下片段来请求libvirt XML中的特定功能,可以验证主机的(物理)CPUID EAX / EDX叶子是否包含所需的值,并指示QEMU将其包含在来宾的CPUID中。

<span style="color:#515151"><code><span style="color:#2f6f9f"><cpu</span> <span style="color:#4f9fcf">match=</span><span style="color:#d44950">'exact'</span><span style="color:#2f6f9f">></span>
  ...
  <span style="color:#2f6f9f"><feature</span> <span style="color:#4f9fcf">policy=</span><span style="color:#d44950">'disable'</span> <span style="color:#4f9fcf">name=</span><span style="color:#d44950">'mmx'</span><span style="color:#2f6f9f">/></span>
  ...
<span style="color:#2f6f9f"></cpu></span>
</code></span>
这使我们对基本vCPU功能构建块有了一个概述。进一步讲,有一种称为CPU模型的东西。重要的是要了解这是什么:CPU模型只是一组功能。指定skylake-clientCPU型号并不能使vCPU成为神奇的处理器。以某种方式减少幻想:此类语句确保vCPU支持Skylake定义功能:

<span style="color:#515151"><code>3dnowprefetch, abm, adx, aes, apic, arat, avx, avx2, bmi1, bmi2, clflush, cmov,
cx16, cx8, de, erms, f16c, fma, fpu, fsgsbase, fxsr, hle, invpcid, lahf_lm, lm,
mca, mce, mmx, movbe, mpx, msr, mtrr, nx, pae, pat, pcid, pclmuldq, pge, pni,
popcnt, pse, pse36, rdrand, rdseed, rdtscp, rtm, sep, smap, smep, sse, sse2,
sse4.1, sse4.2, ssse3, syscall, tsc, tsc-deadline, vme, x2apic, xgetbv1, xsave,
xsavec, xsaveopt
</code></span>
其他CPU模型以类似的方式工作,通常会公开更高模型功能的子集。

主机模型,主机直通
特殊的CPU模型-主机模型和主机直通允许进行非常特定的vCPU设置。首先,主机模型尝试匹配物理CPU支持的所有功能。第二个选项走得更远,尝试将主机CPU的每个细节(不仅是功能)复制到vCPU。不幸的是,事实并非如此。某些标志(例如invtsc)带有特殊处理,在这些特殊情况下将被忽略。这就是oVirt cpuflags钩子变得重要的地方。

cpuflags挂钩
挂钩RPM称为vdsm-hook-cpuflags。为了配置应要求或避免使用的功能,cpuflags使用了名为的自定义属性。该属性使用特定的语法:

+功能包括功能
-功能排除功能
大写GROUP包含一组功能
功能和组用逗号(,)分隔
为了更好地理解,请考虑以下示例:

<span style="color:#515151"><code>cpuflags='+svm,+invpcid,SAP,-ssse3'
</code></span>
在这种情况下,我们

包括svm,invpcid功能
包括SAP功能组,这是一个特殊的组
排除ssse3标志
这些组只是为了方便而命名的功能集。该挂钩会自动删除包含或排除重复的功能,但是如果指定了冲突的选择或无效的组,它将阻止创建VM。冲突的选择大致如下:+flag,-flag。在这种情况下,挂钩无法确定是否应提供该功能,并且避免了猜测。同样,不允许使用未定义的组或不带+/-运算符的小写功能名称,这将导致VM无法启动。

另外,该挂钩必须安装在要利用它的虚拟化主机上,并且必须将ovirt-engine配置为支持自定义属性:

<span style="color:#515151"><code>$ engine-config -s UserDefinedVMProperties='hugepages=^.*$;mdev_uuid=^.*$;cpuflags=^.*$'
Please select a version:
1. 3.6
2. 4.0
3. 4.1
4. 4.2
4
</code></span>
这是新增功能,可以对vCPU功能进行精细调整,以在便利性和性能之间进行权衡。

(责任编辑:IT)
------分隔线----------------------------