148 lines
6.0 KiB
ReStructuredText
148 lines
6.0 KiB
ReStructuredText
.. _cpu_sharing:
|
|
|
|
Enable CPU Sharing
|
|
##################
|
|
|
|
About CPU Sharing
|
|
*****************
|
|
|
|
CPU sharing allows the virtual CPUs (vCPUs) of different VMs to run on the same
|
|
physical CPU, just like how multiple processes run concurrently on a single CPU.
|
|
Internally the hypervisor adopts time slicing scheduling and periodically
|
|
switches among those vCPUs.
|
|
|
|
This feature can help improve overall CPU utilization when the VMs are not fully
|
|
loaded. However, sharing a physical CPU among multiple vCPUs increases the
|
|
worst-case response latency of them, and thus is not suitable for vCPUs running
|
|
latency-sensitive workloads.
|
|
|
|
Dependencies and Constraints
|
|
****************************
|
|
|
|
Consider the following dependencies and constraints:
|
|
|
|
* CPU sharing is a hypervisor feature that is hardware and OS neutral.
|
|
|
|
* CPU sharing is not available for real-time VMs or for VMs with local APIC
|
|
passthrough (via the LAPIC passthrough option in the ACRN Configurator or via
|
|
the Device Model ``--lapic_pt`` option).
|
|
|
|
* You can choose the scheduler the hypervisor uses. A scheduler is an algorithm
|
|
for determining the priority of VMs running on a shared virtual CPU. ACRN
|
|
supports the following schedulers:
|
|
|
|
- Borrowed Virtual Time (BVT), which fairly allocates time slices to multiple
|
|
vCPUs pinned to the same physical CPU. The BVT scheduler is the default and
|
|
is sufficient for most use cases.
|
|
|
|
- No-Operation (NOOP), which runs at most one vCPU on each physical CPU.
|
|
|
|
- Priority based, which supports vCPU scheduling based on their static
|
|
priorities defined in the scenario configuration. A vCPU can be running only
|
|
if there is no higher-priority vCPU running on the same physical CPU.
|
|
|
|
Configuration Overview
|
|
**********************
|
|
|
|
You use the :ref:`acrn_configurator_tool` to enable CPU sharing by assigning the
|
|
same set of physical CPUs to multiple VMs and selecting a scheduler. The
|
|
following documentation is a general overview of the configuration process.
|
|
|
|
To assign the same set of physical CPUs to multiple VMs, set the following
|
|
parameters in each VM's **Basic Parameters**:
|
|
|
|
* VM type: Standard (Real-time VMs don't support CPU sharing)
|
|
* Physical CPU affinity > pCPU ID: Select a physical CPU by its core ID.
|
|
* To add another physical CPU, click **+** on the right side of an existing CPU.
|
|
Or click **-** to delete a CPU.
|
|
* Repeat the process to assign the same physical CPUs to another VM.
|
|
|
|
.. image:: images/configurator-cpusharing-affinity.png
|
|
:align: center
|
|
:class: drop-shadow
|
|
|
|
To select a scheduler, go to **Hypervisor Global Settings > Advanced Parameters
|
|
> Virtual CPU scheduler** and select a scheduler from the list.
|
|
|
|
.. image:: images/configurator-cpusharing-scheduler.png
|
|
:align: center
|
|
:class: drop-shadow
|
|
|
|
Example Configuration
|
|
*********************
|
|
|
|
The following steps show how to enable and verify CPU sharing between two User
|
|
VMs. The example extends the information provided in the :ref:`gsg`.
|
|
|
|
#. In the ACRN Configurator, create a shared scenario with a Service VM and two
|
|
post-launched User VMs.
|
|
|
|
#. For the first User VM, set the following parameters in the VM's **Basic
|
|
Parameters**:
|
|
|
|
* VM name: This example uses ``POST_STD_VM1``.
|
|
* VM type: ``Standard``
|
|
* Physical CPU affinity: Select pCPU ID ``1``, then click **+** and select
|
|
pCPU ID ``2`` to assign the VM to CPU cores 1 and 2.
|
|
|
|
.. image:: images/configurator-cpusharing-vm1.png
|
|
:align: center
|
|
:class: drop-shadow
|
|
|
|
.. image:: images/configurator-cpusharing-affinity.png
|
|
:align: center
|
|
:class: drop-shadow
|
|
|
|
#. For the second User VM, set the following parameters in the VM's **Basic
|
|
Parameters**:
|
|
|
|
* VM name: This example uses ``POST_STD_VM2``.
|
|
* VM type: ``Standard``
|
|
* Physical CPU affinity: Select pCPU ID ``1`` and ``2``. The pCPU IDs must be
|
|
the same as those of ``POST_STD_VM1`` to use the CPU sharing function.
|
|
|
|
#. In **Hypervisor Global Settings > Advanced Parameters > Virtual CPU
|
|
scheduler**, confirm that the default scheduler, Borrowed Virtual Time, is
|
|
selected.
|
|
|
|
#. Save the scenario and launch script.
|
|
|
|
#. Build ACRN, copy all the necessary files from the development computer to
|
|
the target system, and launch the Service VM and post-launched User VMs.
|
|
|
|
#. In the :ref:`ACRN hypervisor shell<acrnshell>`, check the CPU sharing via
|
|
the ``vcpu_list`` command. For example:
|
|
|
|
.. code-block:: none
|
|
|
|
ACRN:\>vcpu_list
|
|
|
|
VM ID PCPU ID VCPU ID VCPU ROLE VCPU STATE THREAD STATE
|
|
===== ======= ======= ========= ========== ==========
|
|
0 0 0 PRIMARY Running RUNNABLE
|
|
0 1 1 SECONDARY Running BLOCKED
|
|
0 2 2 SECONDARY Running BLOCKED
|
|
0 3 3 SECONDARY Running BLOCKED
|
|
1 1 0 PRIMARY Running RUNNING
|
|
1 2 1 SECONDARY Running BLOCKED
|
|
2 1 0 PRIMARY Running BLOCKED
|
|
2 2 1 SECONDARY Running RUNNING
|
|
|
|
The VM ID, PCPU ID, VCPU ID, and THREAD STATE columns provide information to
|
|
help you check CPU sharing. In the VM ID column, VM 0 is the Service VM, VM 1
|
|
is POST_STD_VM1, and VM 2 is POST_STD_VM2. The output shows that ACRN
|
|
assigned all physical CPUs (pCPUs) to VM 0 as expected. It also confirms that
|
|
you assigned pCPUs 1 and 2 to VMs 1 and 2 (via the ACRN Configurator). vCPU 1
|
|
of VM 0 and vCPU 0 of VM 1 and VM 2 are running on the same physical CPU;
|
|
they are sharing the physical CPU execution time. The thread state column
|
|
shows the current states of the vCPUs. The BLOCKED state can occur for
|
|
different reasons, most likely the vCPU is waiting for an I/O operation to be
|
|
completed. Once it is done, the state will change to RUNNABLE. When this vCPU
|
|
gets its pCPU execution time, its state will change to RUNNING, then the vCPU
|
|
is actually running on the pCPU.
|
|
|
|
Learn More
|
|
**********
|
|
|
|
For details on the ACRN CPU virtualization high-level design, For the
|
|
:ref:`hv-cpu-virt`. |