docs: Further tweaks to the CPU models document
Address some feedback from the initial review: - Fix grammar - Reorganize document so it makes sense to talk about CPU mode configuration before CPU models - Go into more detail about CPU mode defaults on different host architectures Change-Id: I3fdd71581e088fd8b18f7377826d095072dd51c0 Signed-off-by: Stephen Finucane <stephenfin@redhat.com>
This commit is contained in:
parent
96d7c42e27
commit
5b7a677082
@ -2,8 +2,9 @@
|
|||||||
CPU models
|
CPU models
|
||||||
==========
|
==========
|
||||||
|
|
||||||
Nova allows you to control the guest CPU model that is exposed to instances.
|
Nova allows you to configure features of the virtual CPU that are exposed to
|
||||||
Use cases include:
|
instances. The combined set of CPU features is collectively referred to as the
|
||||||
|
*CPU model*. Use cases include:
|
||||||
|
|
||||||
* To maximize performance of instances by exposing new host CPU features to the
|
* To maximize performance of instances by exposing new host CPU features to the
|
||||||
guest
|
guest
|
||||||
@ -11,42 +12,45 @@ Use cases include:
|
|||||||
* To ensure a consistent default behavior across all machines, removing
|
* To ensure a consistent default behavior across all machines, removing
|
||||||
reliance on system defaults.
|
reliance on system defaults.
|
||||||
|
|
||||||
|
To configure the virtual CPU, you can configure a :ref:`CPU mode <cpu-modes>`,
|
||||||
|
configure one or more :ref:`named CPU models <cpu-models>`, and explicitly
|
||||||
|
request :ref:`cpu-feature-flags`.
|
||||||
|
|
||||||
|
The `Effective Virtual CPU configuration in Nova`__ presentation from the 2018
|
||||||
|
Berlin Summit provides a good overview of this topic.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
It is also possible to configure the topology of the CPU. This is discussed
|
||||||
|
in :doc:`cpu-topologies`.
|
||||||
|
|
||||||
.. important::
|
.. important::
|
||||||
|
|
||||||
The functionality described below is currently only supported by the
|
The functionality described below is currently only supported by the
|
||||||
libvirt driver.
|
libvirt driver.
|
||||||
|
|
||||||
|
.. __: https://www.openstack.org/videos/summits/berlin-2018/effective-virtual-cpu-configuration-in-nova
|
||||||
|
|
||||||
|
|
||||||
|
.. _cpu-modes:
|
||||||
|
|
||||||
CPU modes
|
CPU modes
|
||||||
---------
|
---------
|
||||||
|
|
||||||
In libvirt, the CPU is specified by providing a base CPU model name (which is a
|
The first step in configuring the guest CPU is configuring the CPU *mode*.
|
||||||
shorthand for a set of feature flags), a set of additional feature flags, and
|
The CPU mode determines whether the CPU model is configured manually based on
|
||||||
the topology (sockets/cores/threads). The libvirt KVM driver provides a number
|
admin configuration or is automatically configured based on the host CPU.
|
||||||
of standard CPU model names. These models are defined in
|
The CPU mode is configured using the :oslo.config:option:`libvirt.cpu_mode`
|
||||||
``/usr/share/libvirt/cpu_map/*.xml``. You can inspect these files to determine
|
config option. This option can accepts one of the following values: ``none``,
|
||||||
which models are supported by your local installation.
|
``host-passthrough``, ``host-model``, and ``custom``.
|
||||||
|
|
||||||
Two Compute configuration options in the :oslo.config:group:`libvirt` group
|
|
||||||
of ``nova.conf`` define which type of CPU model is exposed to the hypervisor
|
|
||||||
when using KVM: :oslo.config:option:`libvirt.cpu_mode` and
|
|
||||||
:oslo.config:option:`libvirt.cpu_models`.
|
|
||||||
|
|
||||||
The :oslo.config:option:`libvirt.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.
|
|
||||||
|
|
||||||
.. __: https://www.openstack.org/videos/summits/berlin-2018/effective-virtual-cpu-configuration-in-nova
|
|
||||||
|
|
||||||
Host model
|
Host model
|
||||||
~~~~~~~~~~
|
~~~~~~~~~~
|
||||||
|
|
||||||
If :oslo.config:option:`cpu_mode=host-model <libvirt.cpu_mode>`, the CPU model
|
If :oslo.config:option:`cpu_mode=host-model <libvirt.cpu_mode>`, libvirt
|
||||||
in ``/usr/share/libvirt/cpu_map/*.xml`` that most closely matches the host and
|
requests the :ref:`named CPU model <cpu-models>` that most closely matches the
|
||||||
requests additional CPU flags to complete the match. This CPU model has a
|
host and requests additional CPU flags to complete the match. This CPU model
|
||||||
number of advantages:
|
has a number of advantages:
|
||||||
|
|
||||||
* It provides almost all of the host CPU features to the guest, thus providing
|
* It provides almost all of the host CPU features to the guest, thus providing
|
||||||
close to the maximum functionality and performance possible.
|
close to the maximum functionality and performance possible.
|
||||||
@ -62,8 +66,9 @@ 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
|
largely identical. However, if your compute nodes span multiple processor
|
||||||
generations, you may be better advised to select a ``custom`` CPU model.
|
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
|
The ``host-model`` CPU mode is the effective default for the KVM & QEMU
|
||||||
(:oslo.config:option:`libvirt.virt_type`\ =``kvm``/``qemu``)
|
hypervisors (:oslo.config:option:`libvirt.virt_type`\ =\ ``kvm``/``qemu``) on
|
||||||
|
x86-64 hosts. This default is provided by libvirt itself.
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
@ -72,9 +77,9 @@ The ``host-model`` CPU model is the default for the KVM & QEMU hypervisors
|
|||||||
definition is transferred to the destination host as-is. This results in the
|
definition is transferred to the destination host as-is. This results in the
|
||||||
migrated guest on the destination seeing exactly the same CPU model as on
|
migrated guest on the destination seeing exactly the same CPU model as on
|
||||||
source even if the destination compute host is capable of providing more CPU
|
source even if the destination compute host is capable of providing more CPU
|
||||||
features. However, shutting down and restarting the guest on the may present
|
features. However, shutting down and restarting the guest may result in a
|
||||||
different hardware to the guest, as per the new capabilities of the
|
different hardware configuration for the guest, as per the new capabilities
|
||||||
destination compute.
|
of the destination compute.
|
||||||
|
|
||||||
Host passthrough
|
Host passthrough
|
||||||
~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~
|
||||||
@ -107,28 +112,28 @@ Custom
|
|||||||
~~~~~~
|
~~~~~~
|
||||||
|
|
||||||
If :oslo.config:option:`cpu_mode=custom <libvirt.cpu_mode>`, you can explicitly
|
If :oslo.config:option:`cpu_mode=custom <libvirt.cpu_mode>`, you can explicitly
|
||||||
specify an ordered list of supported named models using the
|
specify an ordered list of one or more supported named CPU models using the
|
||||||
:oslo.config:option:`libvirt.cpu_models` configuration option. It is expected
|
:oslo.config:option:`libvirt.cpu_models` configuration option. This accepts any
|
||||||
that the list is ordered so that the more common and less advanced CPU models
|
named CPU model that is valid for the given host, as discussed in
|
||||||
are listed earlier.
|
:ref:`cpu-models` below. When more than one CPU model is provided, it is
|
||||||
|
expected that the list will be ordered so that the more common and less
|
||||||
|
advanced CPU models are listed first.
|
||||||
|
|
||||||
In selecting the ``custom`` mode, along with a
|
In selecting the ``custom`` mode, along with a named CPU model that matches the
|
||||||
:oslo.config:option:`libvirt.cpu_models` that matches the oldest of your compute
|
oldest of your compute node CPUs, you can ensure that live migration between
|
||||||
node CPUs, you can ensure that live migration between compute nodes will always
|
compute nodes will always be possible. However, you should ensure that the CPU
|
||||||
be possible. However, you should ensure that the
|
model you select passes the correct CPU feature flags to the guest.
|
||||||
:oslo.config:option:`libvirt.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
|
If you need to further tweak your CPU feature flags in the ``custom`` mode, see
|
||||||
`CPU feature flags`_.
|
:ref:`cpu-feature-flags`.
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
If :oslo.config:option:`libvirt.cpu_models` is configured,
|
If :oslo.config:option:`libvirt.cpu_models` is configured,
|
||||||
the CPU models in the list needs to be compatible with the host CPU. Also, if
|
the CPU models in the list needs to be compatible with the host CPU. Also, if
|
||||||
:oslo.config:option:`libvirt.cpu_model_extra_flags` is configured, all flags
|
:oslo.config:option:`libvirt.cpu_model_extra_flags` is configured, all flags
|
||||||
needs to be compatible with the host CPU. If incompatible CPU models or 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.
|
are specified, nova service will raise an error and fail to start.
|
||||||
|
|
||||||
None
|
None
|
||||||
~~~~
|
~~~~
|
||||||
@ -136,10 +141,129 @@ None
|
|||||||
If :oslo.config:option:`cpu_mode=none <libvirt.cpu_mode>`, libvirt does not
|
If :oslo.config:option:`cpu_mode=none <libvirt.cpu_mode>`, libvirt does not
|
||||||
specify a CPU model. Instead, the hypervisor chooses the default model.
|
specify a CPU model. Instead, the hypervisor chooses the default model.
|
||||||
|
|
||||||
The ``none`` CPU model is the default for all non-KVM.QEMU hypervisors.
|
The ``none`` CPU model is the default for all non-KVM/QEMU hypervisors.
|
||||||
(:oslo.config:option:`libvirt.virt_type`\ !=``kvm``/``qemu``)
|
(:oslo.config:option:`libvirt.virt_type`\ !=``kvm``/``qemu``)
|
||||||
|
|
||||||
|
|
||||||
|
.. _cpu-models:
|
||||||
|
|
||||||
|
CPU models
|
||||||
|
----------
|
||||||
|
|
||||||
|
When :oslo.config:option:`libvirt.cpu_mode` is set to ``custom``, it is
|
||||||
|
possible to configure one or more explicit CPU models that should be used.
|
||||||
|
These CPU model names are shorthand for a set of feature flags.
|
||||||
|
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. For example, consider a host that provides the following
|
||||||
|
(incomplete) set of CPU models:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
$ ls /usr/share/libvirt/cpu_map/x86_*.xml -1
|
||||||
|
...
|
||||||
|
/usr/share/libvirt/cpu_map/x86_Broadwell-IBRS.xml
|
||||||
|
/usr/share/libvirt/cpu_map/x86_Broadwell-noTSX-IBRS.xml
|
||||||
|
/usr/share/libvirt/cpu_map/x86_Broadwell-noTSX.xml
|
||||||
|
/usr/share/libvirt/cpu_map/x86_Broadwell.xml
|
||||||
|
/usr/share/libvirt/cpu_map/x86_Haswell-IBRS.xml
|
||||||
|
/usr/share/libvirt/cpu_map/x86_Haswell-noTSX-IBRS.xml
|
||||||
|
/usr/share/libvirt/cpu_map/x86_Haswell-noTSX.xml
|
||||||
|
/usr/share/libvirt/cpu_map/x86_Haswell.xml
|
||||||
|
/usr/share/libvirt/cpu_map/x86_Icelake-Client-noTSX.xml
|
||||||
|
/usr/share/libvirt/cpu_map/x86_Icelake-Client.xml
|
||||||
|
/usr/share/libvirt/cpu_map/x86_Icelake-Server-noTSX.xml
|
||||||
|
/usr/share/libvirt/cpu_map/x86_Icelake-Server.xml
|
||||||
|
/usr/share/libvirt/cpu_map/x86_IvyBridge-IBRS.xml
|
||||||
|
/usr/share/libvirt/cpu_map/x86_IvyBridge.xml
|
||||||
|
/usr/share/libvirt/cpu_map/x86_SandyBridge-IBRS.xml
|
||||||
|
/usr/share/libvirt/cpu_map/x86_SandyBridge.xml
|
||||||
|
/usr/share/libvirt/cpu_map/x86_Skylake-Client-IBRS.xml
|
||||||
|
/usr/share/libvirt/cpu_map/x86_Skylake-Client-noTSX-IBRS.xml
|
||||||
|
/usr/share/libvirt/cpu_map/x86_Skylake-Client.xml
|
||||||
|
/usr/share/libvirt/cpu_map/x86_Skylake-Server-IBRS.xml
|
||||||
|
/usr/share/libvirt/cpu_map/x86_Skylake-Server-noTSX-IBRS.xml
|
||||||
|
/usr/share/libvirt/cpu_map/x86_Skylake-Server.xml
|
||||||
|
...
|
||||||
|
|
||||||
|
Each of these files contains information about the feature set provided by the
|
||||||
|
CPU model. For example:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
$ cat /usr/share/libvirt/cpu_map/x86_SandyBridge-IBRS.xml
|
||||||
|
<cpus>
|
||||||
|
<model name='SandyBridge-IBRS'>
|
||||||
|
<decode host='on' guest='on'/>
|
||||||
|
<signature family='6' model='42'/> <!-- 0206a0 -->
|
||||||
|
<signature family='6' model='45'/> <!-- 0206d0 -->
|
||||||
|
<vendor name='Intel'/>
|
||||||
|
<feature name='aes'/>
|
||||||
|
<feature name='apic'/>
|
||||||
|
...
|
||||||
|
</model>
|
||||||
|
</cpus>
|
||||||
|
|
||||||
|
You can also list these CPU models using ``virsh cpu-models ARCH``.
|
||||||
|
For example:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
$ virsh cpu-models x86_64
|
||||||
|
...
|
||||||
|
SandyBridge
|
||||||
|
SandyBridge-IBRS
|
||||||
|
IvyBridge
|
||||||
|
IvyBridge-IBRS
|
||||||
|
Haswell-noTSX
|
||||||
|
Haswell-noTSX-IBRS
|
||||||
|
Haswell
|
||||||
|
Haswell-IBRS
|
||||||
|
Broadwell-noTSX
|
||||||
|
Broadwell-noTSX-IBRS
|
||||||
|
Broadwell
|
||||||
|
Broadwell-IBRS
|
||||||
|
Skylake-Client
|
||||||
|
Skylake-Client-IBRS
|
||||||
|
Skylake-Client-noTSX-IBRS
|
||||||
|
Skylake-Server
|
||||||
|
Skylake-Server-IBRS
|
||||||
|
Skylake-Server-noTSX-IBRS
|
||||||
|
Icelake-Client
|
||||||
|
Icelake-Client-noTSX
|
||||||
|
Icelake-Server
|
||||||
|
Icelake-Server-noTSX
|
||||||
|
...
|
||||||
|
|
||||||
|
By settings :oslo.config:option:`cpu_mode=custom <libvirt.cpu_mode>`, it is
|
||||||
|
possible to list one or more of these CPU models in the
|
||||||
|
:oslo.config:option:`libvirt.cpu_models` config option in ``nova.conf``. For
|
||||||
|
example:
|
||||||
|
|
||||||
|
.. code-block:: ini
|
||||||
|
|
||||||
|
[libvirt]
|
||||||
|
cpu_mode = custom
|
||||||
|
cpu_models = IvyBridge
|
||||||
|
|
||||||
|
Typically you will only need to list a single model here, but it can be useful
|
||||||
|
to list multiple CPU models to support requesting CPU feature flags via traits.
|
||||||
|
To do this, simply list the additional CPU models in order of oldest (and
|
||||||
|
therefore most widely supported) to newest. For example:
|
||||||
|
|
||||||
|
.. code-block:: ini
|
||||||
|
|
||||||
|
[libvirt]
|
||||||
|
cpu_mode = custom
|
||||||
|
cpu_models = Penryn,IvyBridge,Haswell,Broadwell,Skylake-Client
|
||||||
|
|
||||||
|
More details on how to request CPU feature flags and why you might wish to
|
||||||
|
specify multiple CPU models are provided in :ref:`cpu-feature-flags` below.
|
||||||
|
|
||||||
|
|
||||||
|
.. _cpu-feature-flags:
|
||||||
|
|
||||||
CPU feature flags
|
CPU feature flags
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user