From 516559022cc4dfc6716f18b85155a6a39bc5e745 Mon Sep 17 00:00:00 2001 From: Vishnu kannan Date: Thu, 17 Mar 2016 12:10:04 -0700 Subject: [PATCH] 1. Make kubelet default to 10ms for CPU quota if limit < 10m for backwards compat. 2. Update documentation to reflect minimum CPU limits. Signed-off-by: Vishnu kannan --- docs/proposals/resource-qos.md | 1 + pkg/kubelet/dockertools/docker.go | 8 +++++++- pkg/kubelet/dockertools/docker_test.go | 15 +++++++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/docs/proposals/resource-qos.md b/docs/proposals/resource-qos.md index 40f2562464e..e0a7109b4f7 100644 --- a/docs/proposals/resource-qos.md +++ b/docs/proposals/resource-qos.md @@ -61,6 +61,7 @@ For each resource, containers can specify a resource request and limit, 0 <= req ### Compressible Resource Guarantees - For now, we are only supporting CPU. +- Minimum CPU limit is 10 milli cores (`10m`). This a limitation of the Linux kernel. - Containers are guaranteed to get the amount of CPU they request, they may or may not get additional CPU time (depending on the other jobs running). - Excess CPU resources will be distributed based on the amount of CPU requested. For example, suppose container A requests for 60% of the CPU, and container B requests for 30% of the CPU. Suppose that both containers are trying to use as much CPU as they can. Then the extra 10% of CPU will be distributed to A and B in a 2:1 ratio (implementation discussed in later sections). - Containers will be throttled if they exceed their limit. If limit is unspecified, then the containers can use excess CPU when available. diff --git a/pkg/kubelet/dockertools/docker.go b/pkg/kubelet/dockertools/docker.go index 08f19a7b038..da6ebd8372d 100644 --- a/pkg/kubelet/dockertools/docker.go +++ b/pkg/kubelet/dockertools/docker.go @@ -50,7 +50,8 @@ const ( milliCPUToCPU = 1000 // 100000 is equivalent to 100ms - quotaPeriod = 100000 + quotaPeriod = 100000 + minQuotaPerod = 1000 ) // DockerInterface is an abstract interface for testability. It abstracts the interface of docker.Client. @@ -317,6 +318,11 @@ func milliCPUToQuota(milliCPU int64) (quota int64, period int64) { // we then convert your milliCPU to a value normalized over a period quota = (milliCPU * quotaPeriod) / milliCPUToCPU + // quota needs to be a minimum of 1ms. + if quota < minQuotaPerod { + quota = minQuotaPerod + } + return } diff --git a/pkg/kubelet/dockertools/docker_test.go b/pkg/kubelet/dockertools/docker_test.go index 8fdd79d3c08..1a7366560ec 100644 --- a/pkg/kubelet/dockertools/docker_test.go +++ b/pkg/kubelet/dockertools/docker_test.go @@ -839,6 +839,21 @@ func TestMilliCPUToQuota(t *testing.T) { quota: int64(0), period: int64(0), }, + { + input: int64(5), + quota: int64(1000), + period: int64(100000), + }, + { + input: int64(9), + quota: int64(1000), + period: int64(100000), + }, + { + input: int64(10), + quota: int64(1000), + period: int64(100000), + }, { input: int64(200), quota: int64(20000),