Leverage remote partitions for exclusive CPUs (Linux 6.7+)
Author: tallclairCreated Sep 25, 2026Updated Sep 28, 2026
Labelspriority/backlogsig/nodekind/featuretriage/accepted
Linux 6.7 added support for "remote partitions", which enables containers to allocate exclusive CPUs without modifying any other cgroups. With the deprecation of cgroups v1, we should migrate CPU manager to leverage this approach.
Background
Currently, with static CPU policy, cpu_manager runs a reconcile loop (default 10s period) to sync CPU allocation to containers. It manages a default set, and every container that doesn't have exclusive CPUs gets assigned the default set. The default set is updated (for every container) to remove CPUs as they're allocated exclusively.
Problems with this approach:
- Eventual consistency: When an exclusive CPU is assigned, there is up to 10s (or more!) delay before that CPU is removed from the default set of other containers.
- No protection from system processes: Only containers managed by the Kubelet are excluded from using the assigned CPUs. System processes (e.g. the Kubelet itself) can still be scheduled to it.
- Every static CPU assignment (or release) requires updating every other container on the node. These are all done through
UpdateContainerResourcesrequests, and are subject to global NRI locks. - Container reconciliation outside of SyncPod: the reconcile loop calls UpdateContainerResources directly. Normally, all direct container operations like that happen within SyncPod. Performing the operation outside of SyncPod makes this more prone to race conditions.
Proposal
- The full set of assignable CPUs is written to
cpuset.cpus.exclusiveon the full cgroup tree (kubelet.slice,kubelet-kubepods.slice), and pod-level cgroups. - When a container is assigned exclusive CPUs, it sets
cpuset.cpus.exclusiveto the assigned set, andcpuset.cpus.partition=root(some specialized workloads like DPDK may wantisolated). This is set on container creation, or indoPodResizeActionon resize, both of which are inSyncPod. - Remove the cpu_manager reconciliation loop: it's no longer needed.
/sig node /kind feature /cc @pravk03 @ffromani @dchen1107 @Chunxia202410 @lukaszwojciechowski @esotsal
Source: kubernetes/kubernetes