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) |