Use PCPU and VCPU in one instance
We'd like to propose a way to create instance to take using of PCPU and VCPU resource in one instance. Re-proposed in U release. Change-Id: I0c4ffe349dc9381c83c836efb4af99d072169c88
This commit is contained in:
397
specs/ussuri/approved/use-pcpu-vcpu-in-one-instance.rst
Normal file
397
specs/ussuri/approved/use-pcpu-vcpu-in-one-instance.rst
Normal file
@@ -0,0 +1,397 @@
|
||||
..
|
||||
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||||
License.
|
||||
|
||||
=========================================
|
||||
Use ``PCPU`` and ``VCPU`` in One Instance
|
||||
=========================================
|
||||
|
||||
https://blueprints.launchpad.net/nova/+spec/use-pcpu-and-vcpu-in-one-instance
|
||||
|
||||
The spec `CPU resource tracking`_ splits host CPUs into ``PCPU`` and ``VCPU``
|
||||
resources, making it possible to run instances of ``dedicated`` CPU allocation
|
||||
policy and instances of ``shared`` CPU allocation policy in the same host.
|
||||
This spec aims to create such kind of instance that some of the CPUs are
|
||||
dedicated (``PCPU``) CPUs and the remaining CPUs are shared (``VCPU``) CPUs
|
||||
and expose this information via the metadata API.
|
||||
|
||||
Problem description
|
||||
===================
|
||||
|
||||
The current CPU allocation policy, ``dedicated`` or ``shared``, is applied to
|
||||
all CPUs of an instance. However, with the introduction of
|
||||
`CPU resource tracking`_, it is possible to propose a more fine-grained CPU
|
||||
allocation policy, which is based on the control over individual instance CPU,
|
||||
and specifying the ``dedicated`` or ``shared`` CPU allocation policy to each
|
||||
instance CPU.
|
||||
|
||||
Use Cases
|
||||
---------
|
||||
|
||||
As an operator, I would like to have an instance with some realtime CPUs for
|
||||
high performance, and at the same time, in order to increase instance density,
|
||||
I wish to make the remaining CPUs, which do not demand high performance,
|
||||
shared with other instances because I only care about the performance of
|
||||
realtime CPUs. One example is deploying the NFV task that is enhanced with
|
||||
DPDK framework in the instance, in which the data plane threads could be
|
||||
processed with the realtime CPUs and the control-plane tasks are scheduled
|
||||
on CPUs that may be shared with other instances.
|
||||
|
||||
As a Kubernetes administrator, I wish to run a multi-tier or auto-scaling
|
||||
application in Kubernetes, which is running in single OpenStack VM, with
|
||||
the expectation that using dedicated high-performance CPUs for application
|
||||
itself and deploying the containers on shared cores.
|
||||
|
||||
Proposed change
|
||||
===============
|
||||
|
||||
Introduce a new CPU allocation policy ``mixed``
|
||||
-----------------------------------------------
|
||||
|
||||
``dedicated`` and ``shared`` are the existing instance CPU allocation policies
|
||||
that determine how instance CPU is scheduled on host CPU. This specification
|
||||
proposes a new CPU allocation policy, with the name ``mixed``, to
|
||||
create a CPU *mixed* instance in such way that some instance CPUs are
|
||||
allocated from computing node's ``PCPU`` resource, and the rest of instance
|
||||
CPUs are allocated from the ``VCPU`` resources. The CPU allocated from
|
||||
``PCPU`` resource will be pinned on particular host CPUs which are defined in
|
||||
``CONF.compute.dedicated_cpu_set``, and the CPU from ``VCPU`` resource will be
|
||||
floating on the host CPUs which are defined in ``CONF.compute.shared_cpu_set``.
|
||||
In this proposal, we call these two kinds of CPUs as *dedicated* vCPU and
|
||||
*shared* vCPU respectively.
|
||||
|
||||
Instance CPU policy matrix
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Nova operator may set the instance CPU allocation policy through the
|
||||
``hw:cpu_policy`` and ``hw_cpu_policy`` interfaces, which may raise conflict.
|
||||
The CPU policy conflict is proposed to be solved with the following policy
|
||||
matrix:
|
||||
|
||||
+---------------------------+-----------+-----------+-----------+-----------+
|
||||
| | hw:cpu_policy |
|
||||
+ INSTANCE CPU POLICY +-----------+-----------+-----------+-----------+
|
||||
| | DEDICATED | MIXED | SHARED | undefined |
|
||||
+---------------+-----------+-----------+-----------+-----------+-----------+
|
||||
| hw_cpu_policy | DEDICATED | dedicated | conflict | conflict | dedicated |
|
||||
+ +-----------+-----------+-----------+-----------+-----------+
|
||||
| | MIXED | dedicated | mixed | conflict | mixed |
|
||||
+ +-----------+-----------+-----------+-----------+-----------+
|
||||
| | SHARED | dedicated | conflict | shared | shared |
|
||||
+ +-----------+-----------+-----------+-----------+-----------+
|
||||
| | undefined | dedicated | mixed | shared | undefined |
|
||||
+---------------+-----------+-----------+-----------+-----------+-----------+
|
||||
|
||||
For example, if a ``dedicated`` CPU policy is specified in instance flavor
|
||||
``hw:cpu_policy``, then the instance CPU policy is ``dedicated``, regardless
|
||||
of the setting specified in image property ``hw_cpu_policy``. If ``shared``
|
||||
is explicitly set in ``hw:cpu_policy``, then a ``mixed`` policy specified
|
||||
in ``hw_cpu_policy`` is conflict, which will throw an exception, the instance
|
||||
booting request will be rejected.
|
||||
|
||||
If there is no explicit instance CPU policy specified in flavor or image
|
||||
property, the flavor matrix result would be 'undefined', and the final
|
||||
instance policy is further determined and resolved by ``resources:PCPU``
|
||||
and ``resources:VCPU`` specified in flavor extra specs. Refer to
|
||||
:ref:`section<mixed-instance-via-PCPU-VCPU>` and the spec
|
||||
`CPU resource tracking`_.
|
||||
|
||||
Affect over real-time vCPUs
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
It's also possible to set some *mixed* instance vCPUs as real-time vCPU,
|
||||
*realtime* CPUs must be chosen from the instance *dedicated* CPU set.
|
||||
|
||||
Affect over emulator thread policy
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
If emulator thread policy is ``ISOLATE``, the *mixed* instance will look for
|
||||
a *dedicated* host CPU for instance emulator thread, which is very similar
|
||||
to the case introduced by ``dedicated`` policy instance.
|
||||
|
||||
If the emulator thread policy is ``SHARE``, then the instance emulator thread
|
||||
will float over the host CPUs defined in configuration
|
||||
``CONF.compute.cpu_shared_set``.
|
||||
|
||||
Set dedicated CPU bit-mask in ``hw:pinned_cpus`` for ``mixed`` instance
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
As an interface to create the ``mixed`` policy instance through legacy flavor
|
||||
extra specs or image properties, the flavor extra spec ``hw:pinned_cpus`` is
|
||||
introduced. If the extra spec ``hw:pinned_cpus`` is found in the instance
|
||||
flavor, then the information of the *dedicated* CPU could be found through
|
||||
parsing ``hw:pinned_cpus``.
|
||||
Here is the example to create an instance with ``mixed`` policy:
|
||||
|
||||
.. code::
|
||||
|
||||
$ openstack flavor set <flavor_id> \
|
||||
--property hw:cpu_policy=mixed \
|
||||
--property hw:pinned_cpus=0-3,7
|
||||
|
||||
And, following is the proposing command to create a *mixed* instance which
|
||||
consists of multiple NUMA nodes by setting the *dedicated* CPUs in
|
||||
``hw:pinned_cpus``:
|
||||
|
||||
.. code::
|
||||
|
||||
$ openstack flavor set <flavor_id> \
|
||||
--property hw:cpu_policy=mixed \
|
||||
--property hw:pinned_cpus=2,7 \
|
||||
--property hw:numa_nodes=2 \
|
||||
--property hw:numa_cpus.0=0-2 \
|
||||
--property hw:numa_cpus.1=3-7 \
|
||||
--property hw:numa_mem.0=1024 \
|
||||
--property hw:numa_mem.1=2048
|
||||
|
||||
.. note::
|
||||
Please be aware that there is no equivalent setting in image properties
|
||||
for flavor extra spec ``hw:pinned_cpus``. It will not be supported to
|
||||
create *mixed* instance through image properties.
|
||||
|
||||
.. _mixed-instance-via-PCPU-VCPU:
|
||||
|
||||
Create *mixed* instance via ``resources:PCPU`` and ``resources:VCPU``
|
||||
---------------------------------------------------------------------
|
||||
|
||||
`CPU resource tracking`_ introduced a way to create an instance with
|
||||
``dedicated`` or ``shared`` CPU allocation policy through ``resources:PCPU``
|
||||
and ``resources:VCPU`` interfaces, but did not allow requesting both ``PCPU``
|
||||
resource and ``VCPU`` resource for one instance.
|
||||
|
||||
This specification proposes to let an instance request ``PCPU`` resource along
|
||||
with ``VCPU``, and effectively applying for the ``mixed`` CPU allocation
|
||||
policy if the ``cpu_policy`` is not explicitly specified in the flavor list.
|
||||
So an instance with such flavors potentially creates a ``mixed`` policy
|
||||
instance:
|
||||
|
||||
.. code::
|
||||
|
||||
$ openstack flavor set \
|
||||
--property "resources:PCPU"="<dedicated CPU number>" \
|
||||
--property "resources:VCPU"="<shared CPU number>" \
|
||||
<flavor_id>
|
||||
|
||||
For *mixed* instance created in such way, both <shared CPU number> and
|
||||
<dedicated CPU number> must be greater than zero. Otherwise, it effectively
|
||||
creates the ``dedicated`` or ``shared`` policy instance, that all CPUs in the
|
||||
instance is in a same allocation policy.
|
||||
|
||||
The ``resources:PCPU`` and ``resources::VCPU`` interfaces only put the request
|
||||
toward ``Placement`` service for how many ``PCPU`` and ``VCPU`` resources are
|
||||
required to fulfill the instance vCPU thread and emulator thread requirement.
|
||||
The ``PCPU`` and ``VCPU`` distribution on the instance, especially on the
|
||||
instance with multiple NUMA nodes, will be spread across the NUMA nodes in the
|
||||
round-robin way, and ``VCPU`` will be put ahead of ``PCPU``. Here is one
|
||||
example and the instance is created with flavor below::
|
||||
|
||||
flavor:
|
||||
vcpus:8
|
||||
memory_mb=512
|
||||
extra_specs:
|
||||
hw:numa_nodes:2
|
||||
resources:VCPU=3
|
||||
resources:PCPU=5
|
||||
|
||||
Instance emulator thread policy is not specified in the flavor, so it does not
|
||||
occupy any dedicated ``PCPU`` resource for it, all ``PCPU`` and ``VCPU``
|
||||
resources will be used by vCPU threads, and the expected distribution on NUMA
|
||||
nodes is::
|
||||
|
||||
NUMA node 0: VCPU VCPU PCPU PCPU
|
||||
NUMA node 1: VCPU PCPU PCPU PCPU
|
||||
|
||||
.. note::
|
||||
The demanding instance CPU number is the number of vCPU, specified by
|
||||
``flavor.vcpus``, plus the number of CPU that is special for emulator
|
||||
thread, and if the emulator thread policy is ``ISOLATE``, the instance
|
||||
requests ``flavor.vcpus`` + 1 vCPUs, if the policy is not ``ISOLATE``,
|
||||
the instance just requests ``flavor.vcpus`` vCPU.
|
||||
|
||||
Alternatives
|
||||
------------
|
||||
|
||||
Creating CPU mixed instance by extending the ``dedicated`` policy
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Instead of adding a special instance CPU allocation policy, the CPU mixed
|
||||
instance is supported by extending the existing ``dedicated`` policy and
|
||||
specifying the CPUs that are pinned to the host CPUs chosen from ``PCPU``
|
||||
resource.
|
||||
|
||||
Following extra spec and the image property are defined to keep the
|
||||
*dedicated* CPUs of a ``mixed`` policy instance::
|
||||
|
||||
hw:cpu_dedicated_mask=<cpu set string>
|
||||
hw_cpu_dedicated_mask=<cpu set string>
|
||||
|
||||
The ``<cpu set string>`` shares the same definition defined above.
|
||||
|
||||
This was rejected at it overloads the ``dedicated`` policy to mean two things,
|
||||
depending on the value of another configuration option.
|
||||
|
||||
Creating ``mixed`` instance with ``hw:cpu_policy`` and ``resources:(P|V)CPU``
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Following commands was proposed as an example to create a *mixed* instance by
|
||||
an explicit request of ``PCPU`` resources, and infer the ``VCPU`` count by
|
||||
``flavor::vcpus`` and ``PCPU`` count:
|
||||
|
||||
.. code::
|
||||
|
||||
$ openstack flavor create mixed_vmf --vcpus 4 --ram 512 --disk 1
|
||||
$ openstack flavor set mixed_vmf \
|
||||
--property hw:cpu_policy=mixed \
|
||||
--property resources:PCPU=2
|
||||
|
||||
This was rejected due to the mixing use of ``hw:cpu_policy`` and
|
||||
``resources:PCPU``. It is not recommended to mix placement style syntax with
|
||||
traditional extra specs.
|
||||
|
||||
Data model impact
|
||||
-----------------
|
||||
|
||||
No change to data objects.
|
||||
|
||||
..note::
|
||||
The ``InstanceNUMACell.cpu_pinning`` field keeps the CPU pinning
|
||||
information with the instance CPU ID and the host CPU ID that the
|
||||
instance CPU is pinning on. This field is used and filled after the CPU
|
||||
pair information is determined for the instance taking the ``dedicated``
|
||||
policy.
|
||||
This field will also be used for ``mixed`` policy instance with the same
|
||||
purpose, but will be initialized with a dictionary keyed by the instance
|
||||
CPU IDs that wants to be pinned on host CPUs at the instance object
|
||||
creating stage. The value of this field will be initialized with *-1*,
|
||||
which means host CPU ID is not valid because the host accommodating the
|
||||
instance is not determined in instance creating stage. The value is
|
||||
replaced with appropriate host CPU ID by nova-scheduler.
|
||||
|
||||
REST API impact
|
||||
---------------
|
||||
|
||||
The metadata API will be extended with the *dedicated* vCPU info and a new
|
||||
OpenStack metadata version will be added to indicate this is a new metadata
|
||||
API.
|
||||
|
||||
The new field will be added to the ``meta_data.json``::
|
||||
|
||||
dedicated_cpus=<cpu set string>
|
||||
|
||||
The ``<cpu set string>`` indicated the vCPU IDs which are running on dedicated
|
||||
host CPUs.
|
||||
|
||||
The new cpu policy ``mixed`` is added to extra spec ``hw:cpu_policy``.
|
||||
|
||||
Security impact
|
||||
---------------
|
||||
|
||||
None
|
||||
|
||||
Notifications impact
|
||||
--------------------
|
||||
|
||||
None
|
||||
|
||||
Other end user impact
|
||||
---------------------
|
||||
|
||||
If the end user wants to create an instance with a ``mixed`` CPU allocation
|
||||
policy, the user is required to set corresponding flavor extra specs or image
|
||||
properties.
|
||||
|
||||
Performance Impact
|
||||
------------------
|
||||
|
||||
This proposal affects the selection of instance CPU allocation policy, but the
|
||||
performance impact is trivial.
|
||||
|
||||
Other deployer impact
|
||||
---------------------
|
||||
|
||||
None
|
||||
|
||||
Developer impact
|
||||
----------------
|
||||
|
||||
None
|
||||
|
||||
Upgrade impact
|
||||
--------------
|
||||
|
||||
The ``mixed`` cpu policy is only available when the whole cluster upgrade
|
||||
finished. A service version will be bumped for detecting the upgrade.
|
||||
|
||||
Implementation
|
||||
==============
|
||||
|
||||
Assignee(s)
|
||||
-----------
|
||||
|
||||
Primary assignee:
|
||||
Wang, Huaqiang <huaqiang.wang@intel.com>
|
||||
|
||||
Feature Liaison
|
||||
---------------
|
||||
|
||||
Feature liaison:
|
||||
Stephen Finucane <stephenfin@redhat.com>
|
||||
|
||||
Work Items
|
||||
----------
|
||||
|
||||
* Add new instance CPU allocation policy ``mixed`` property and resolve
|
||||
conflicts
|
||||
* Bump nova service version.
|
||||
* Add flavor extra spec ``hw:pinned_cpus`` and create *mixed* instance
|
||||
* Translate *dedicated* and *shared* CPU request to placement ``PCPU`` and
|
||||
``VCPU`` resources request.
|
||||
* Change libvirt driver to create ``PCPU`` mapping and ``VCPU`` mapping
|
||||
* Add nova metadata service by offering final pCPU layout in
|
||||
``dedicated_cpus`` field
|
||||
* Validate real-time CPU mask for ``mixed`` instance.
|
||||
|
||||
Dependencies
|
||||
============
|
||||
|
||||
None
|
||||
|
||||
Testing
|
||||
=======
|
||||
|
||||
Functional and unit tests are required to cover:
|
||||
|
||||
* Ensure to solve the conflicts between the CPU policy matrix
|
||||
* Ensure only *dedicated* vCPUs are possible to be real-time vCPUs
|
||||
* Ensure creating ``mixed`` policy instance properly either by flavor
|
||||
settings or by ``resources::PCPU=xx`` and ``resources::VCPU=xx`` settings.
|
||||
* Ensure *shared* vCPUs is placed before the ``dedicated`` vCPUs
|
||||
* Ensure the emulator CPU is properly scheduled according to its policy.
|
||||
|
||||
Documentation Impact
|
||||
====================
|
||||
|
||||
The documents should be changed to introduce the usage of new ``mixed`` CPU
|
||||
allocation policy and the new flavor extra specs.
|
||||
|
||||
Metadata service will be updated accordingly.
|
||||
|
||||
References
|
||||
==========
|
||||
|
||||
* `CPU resource tracking`_
|
||||
|
||||
.. _CPU resource tracking: http://specs.openstack.org/openstack/nova-specs/specs/train/approved/cpu-resources.html
|
||||
|
||||
History
|
||||
=======
|
||||
|
||||
.. list-table:: Revisions
|
||||
:header-rows: 1
|
||||
|
||||
* - Release Name
|
||||
- Description
|
||||
* - Train
|
||||
- Introduced, abandoned
|
||||
* - Ussuri
|
||||
- Re-proposed
|
||||
Reference in New Issue
Block a user