---
title: Allocate physical cores for virtual machines
---

# Allocate physical cores for virtual machines {#virt-physical-cores-allocation-vms}

As a cluster administrator, you can allocate a full physical core to a specific virtual machine (VM), instead of allowing different VMs to share the same physical core. Configuring your VMs to use only full physical cores can optimize performance for high-throughput or latency-critical VMs.

Allocating only full physical cores is important on simultaneous multi-threading (SMT) enabled systems because it offers the following benefits:

- Prevents noisy neighbors and resource contention
- Mitigates performance degradation
- Offers predictable latency
- Guarantees exclusive CPU resources

## Configure full physical core allocation for virtual machines {#virt-CPU-manager-policy_virt-physical-cores-allocation-vms}

You can configure full physical core allocation by modifying the `cpuManagerPolicy` and `cpuManagerPolicyOptions` settings in the `KubeletConfig` custom resource (CR).

**Prerequisites**

- You have cluster administrator access to a OpenShift Container Platform cluster with OpenShift Virtualization installed.
- You have installed the OpenShift CLI (`oc`).
- You have enabled CPU Manager on the node where your VM runs.

**Procedure**

1. Edit the `KubeletConfig` CR to add the required `cpuManagerPolicy` and `cpuManagerPolicyOptions` configurations:

   ```yaml
   apiVersion: machineconfiguration.openshift.io/v1
   kind: KubeletConfig
   # ...
   cpuManagerPolicy: static
   cpuManagerPolicyOptions:
     full-pcpus-only: true
   kubeReserved:
     cpu: "1"
   # ...
   ```

   - You must set the `cpuManagerPolicy: static` policy to enable exclusive CPU allocation. This setting is a prerequisite for configuring the `cpuManagerPolicyOptions` settings.
   - You must set the `full-pcpus-only: true` policy option so that the static CPU Manager policy only allocates full physical cores.
   - You must reserve 1 CPU for the system by setting `cpu: "1"` in the `kubeReserved` settings. This ensures that the cluster remains stable, by requiring that the system’s core functions always have access to the CPU that they need to work correctly.
2. Run the following command to apply the changes to the `KubeletConfig` CR:

   ```terminal
   $ oc apply -f <filename>.yaml
   ```

**Verification**

- Inspect the kubelet configuration on a node where the change you applied the change, by running the following command and inspecting the output:

  ```terminal
  $ oc debug node/<node_name> -- chroot /host cat /etc/kubernetes/kubelet.conf | grep -E -A 2 'cpuManagerPolicy|kubeReserved'
  ```

  Example output:

  ```YAML
  cpuManagerPolicy: static
  cpuManagerPolicyOptions:
    full-pcpus-only: true
  --
  kubeReserved:
    cpu: "1"
  ```
