From de0ece541c7fd885a32f1562342fe85535fc11f5 Mon Sep 17 00:00:00 2001 From: Odin Ugedal Date: Sun, 14 Nov 2021 19:45:47 +0000 Subject: [PATCH] Fix cpu share issues on systems with large amounts of cpu On systems where the calculated cpu shares results in a value above the max value in linux, containers getting that value are unable to start. This occur on systems with 300+ cpu cores, and where containers are given such a value. This issue was fixed for the pod and qos control groups in the similar cm.MilliCPUToShares that also has tests verifying the behavior. Since this code already has an dependency on kubelet/cm, lets reuse that code instead. --- pkg/kubelet/kuberuntime/helpers_linux.go | 17 ----------------- pkg/kubelet/kuberuntime/helpers_unsupported.go | 5 ----- .../kuberuntime/kuberuntime_container_linux.go | 6 +++--- 3 files changed, 3 insertions(+), 25 deletions(-) diff --git a/pkg/kubelet/kuberuntime/helpers_linux.go b/pkg/kubelet/kuberuntime/helpers_linux.go index 2a476a52659..3f83ff86e4a 100644 --- a/pkg/kubelet/kuberuntime/helpers_linux.go +++ b/pkg/kubelet/kuberuntime/helpers_linux.go @@ -20,9 +20,6 @@ limitations under the License. package kuberuntime const ( - // Taken from lmctfy https://github.com/google/lmctfy/blob/master/lmctfy/controllers/cpu_controller.cc - minShares = 2 - sharesPerCPU = 1024 milliCPUToCPU = 1000 // 100000 is equivalent to 100ms @@ -30,20 +27,6 @@ const ( minQuotaPeriod = 1000 ) -// milliCPUToShares converts milliCPU to CPU shares -func milliCPUToShares(milliCPU int64) int64 { - if milliCPU == 0 { - // Return 2 here to really match kernel default for zero milliCPU. - return minShares - } - // Conceptually (milliCPU / milliCPUToCPU) * sharesPerCPU, but factored to improve rounding. - shares := (milliCPU * sharesPerCPU) / milliCPUToCPU - if shares < minShares { - return minShares - } - return shares -} - // milliCPUToQuota converts milliCPU to CFS quota and period values func milliCPUToQuota(milliCPU int64, period int64) (quota int64) { // CFS quota is measured in two values: diff --git a/pkg/kubelet/kuberuntime/helpers_unsupported.go b/pkg/kubelet/kuberuntime/helpers_unsupported.go index 1f5c8093a1b..95693fadda9 100644 --- a/pkg/kubelet/kuberuntime/helpers_unsupported.go +++ b/pkg/kubelet/kuberuntime/helpers_unsupported.go @@ -18,8 +18,3 @@ limitations under the License. */ package kuberuntime - -// milliCPUToShares converts milliCPU to CPU shares -func milliCPUToShares(milliCPU int64) int64 { - return 0 -} diff --git a/pkg/kubelet/kuberuntime/kuberuntime_container_linux.go b/pkg/kubelet/kuberuntime/kuberuntime_container_linux.go index f8956acf728..9acecd563f8 100644 --- a/pkg/kubelet/kuberuntime/kuberuntime_container_linux.go +++ b/pkg/kubelet/kuberuntime/kuberuntime_container_linux.go @@ -139,11 +139,11 @@ func (m *kubeGenericRuntimeManager) calculateLinuxResources(cpuRequest, cpuLimit // API server does this for new containers, but we repeat this logic in Kubelet // for containers running on existing Kubernetes clusters. if cpuRequest.IsZero() && !cpuLimit.IsZero() { - cpuShares = milliCPUToShares(cpuLimit.MilliValue()) + cpuShares = int64(cm.MilliCPUToShares(cpuLimit.MilliValue())) } else { - // if cpuRequest.Amount is nil, then milliCPUToShares will return the minimal number + // if cpuRequest.Amount is nil, then MilliCPUToShares will return the minimal number // of CPU shares. - cpuShares = milliCPUToShares(cpuRequest.MilliValue()) + cpuShares = int64(cm.MilliCPUToShares(cpuRequest.MilliValue())) } resources.CpuShares = cpuShares if memLimit != 0 {