More information taken out of the catchall KVM guide and put into its own doc, where it belongs. Change-Id: I4a03561368b945e3aacbef8011b46933cc1fcfd7 Signed-off-by: Stephen Finucane <stephenfin@redhat.com>
6.8 KiB
CPU models
Nova allows you to control the guest CPU model that is exposed to instances. Use cases include:
- To maximize performance of instances by exposing new host CPU features to the guest
- To ensure a consistent default behavior across all machines, removing reliance on system defaults.
Important
The functionality described below is currently only supported by the libvirt driver.
CPU modes
In libvirt, the CPU is specified by providing a base CPU model name
(which is a shorthand for a set of feature flags), a set of additional
feature flags, and the topology (sockets/cores/threads). The libvirt KVM
driver provides a number of standard CPU model names. These models are
defined in /usr/share/libvirt/cpu_map/*.xml. You can
inspect these files to determine which models are supported by your
local installation.
Two Compute configuration options in the :oslo.configlibvirt group of
nova.conf define which type of CPU model is exposed to the
hypervisor when using KVM: :oslo.configlibvirt.cpu_mode and :oslo.configlibvirt.cpu_models.
The :oslo.configlibvirt.cpu_mode option can take one of the
following values: none, host-passthrough,
host-model, and custom.
See Effective Virtual CPU configuration in Nova for a recorded presentation about this topic.
Host model
If :oslo.configcpu_mode=host-model <libvirt.cpu_mode>, the
CPU model in /usr/share/libvirt/cpu_map/*.xml that most
closely matches the host, and requests additional CPU flags to complete
the match. This configuration provides the maximum functionality and
performance and maintains good reliability.
With regard to enabling and facilitating live migration between
compute nodes, you should assess whether host-model is
suitable for your compute architecture. In general, using
host-model is a safe choice if your compute node CPUs are
largely identical. However, if your compute nodes span multiple
processor generations, you may be better advised to select a
custom CPU model.
The host-model CPU model is the default for the KVM
& QEMU hypervisors (:oslo.configlibvirt.virt_type=kvm/qemu)
Host passthrough
If :oslo.configcpu_mode=host-passthrough <libvirt.cpu_mode>,
libvirt tells KVM to pass through the host CPU with no modifications. In
comparison to host-model which simply matches feature
flags, host-passthrough ensures every last detail of the
host CPU is matched. This gives the best performance, and can be
important to some apps which check low level CPU details, but it comes
at a cost with respect to migration.
In host-passthrough mode, the guest can only be
live-migrated to a target host that matches the source host extremely
closely. This definitely includes the physical CPU model and running
microcode, and may even include the running kernel. Use this mode only
if:
- Your compute nodes have a very large degree of homogeneity (i.e. substantially all of your compute nodes use the exact same CPU generation and model), and you make sure to only live-migrate between hosts with exactly matching kernel versions, or
- You decide, for some reason and against established best practices, that your compute infrastructure should not support any live migration at all.
Custom
If :oslo.configcpu_mode=custom <libvirt.cpu_mode>, you can
explicitly specify an ordered list of supported named models using the
:oslo.configlibvirt.cpu_models configuration option. It is
expected that the list is ordered so that the more common and less
advanced CPU models are listed earlier.
In selecting the custom mode, along with a
:oslo.configlibvirt.cpu_models that matches the oldest of your
compute node CPUs, you can ensure that live migration between compute
nodes will always be possible. However, you should ensure that the
:oslo.configlibvirt.cpu_models you select passes the correct
CPU feature flags to the guest.
If you need to further tweak your CPU feature flags in the
custom mode, see CPU feature
flags.
Note
If :oslo.configlibvirt.cpu_models is configured, the CPU models in
the list needs to be compatible with the host CPU. Also, if
:oslo.configlibvirt.cpu_model_extra_flags is configured, all
flags needs to be compatible with the host CPU. If incompatible CPU
models or flags are specified, nova service will raise an error and fail
to start.
None
If :oslo.configcpu_mode=none <libvirt.cpu_mode>, libvirt
does not specify a CPU model. Instead, the hypervisor chooses the
default model.
The none CPU model is the default for all non-KVM.QEMU
hypervisors. (:oslo.configlibvirt.virt_type!=kvm/qemu)
CPU feature flags
18.0.0 (Rocky)
Regardless of your configured :oslo.configlibvirt.cpu_mode, it is
also possible to selectively enable additional feature flags. This can
be accomplished using the :oslo.configlibvirt.cpu_model_extra_flags config option. For
example, suppose you have configured a custom CPU model of
IvyBridge, which normally does not enable the
pcid feature flag, but you do want to pass
pcid into your guest instances. In this case, you could
configure the following in nova.conf to enable this
flag.
[libvirt]
cpu_mode = custom
cpu_models = IvyBridge
cpu_model_extra_flags = pcidAn end user can also specify required CPU features through traits.
When specified, the libvirt driver will select the first CPU model in
the :oslo.configlibvirt.cpu_models list that can provide the
requested feature traits. If no CPU feature traits are specified then
the instance will be configured with the first CPU model in the
list.
Consider the following nova.conf:
[libvirt]
cpu_mode = custom
cpu_models = Penryn,IvyBridge,Haswell,Broadwell,Skylake-ClientThese different CPU models support different feature flags and are
correctly configured in order of oldest (and therefore most widely
supported) to newest. If the user explicitly required the
avx and avx2 CPU features, the latter of which
is only found of Haswell-generation processors or newer, then they could
request them using the :novatrait{group}:HW_CPU_X86_AVX and :novatrait{group}:HW_CPU_X86_AVX2 flavor extra
specs. For example:
$ openstack flavor set $FLAVOR \
--property trait:HW_CPU_X86_AVX=required \
--property trait:HW_CPU_X86_AVX2=required
As Haswell is the first CPU model supporting both of
these CPU features, the instance would be configured with this
model.