The core principle most readers miss is that CPU limits are tied to CPU throttling , which is markedly different than CPU time sharing . I would argue that in 99% of cases, you truly do not need or want limits. limits cause CPU throttling, which is like running your process in a strobe light. If your quota period is 100ms, you might only be able to make progress for 10ms out of every 100ms period, regardless of wheth…
Kubernetes: Make your services faster by removing CPU limits
81–90 of 111 posts
Re: Kubernetes: Make your services faster by removing CPU limits
#82Couldn't the unresponsive kubectl issue be resolved by isolating cpus and controlling yourself where processes go?
I'm not sure if this is a real issue; Normally (on gke for example) you can't use 100% cpu because of this. If they saw the issue, then either they have not configured their nodes right, missconfigured them or perhaps run something very old? I'm quite curious to see a proper test bench
Re: Kubernetes: Make your services faster by removing CPU limits
#83This means
1. we're using a kernel that doesn't contain the patch. 2. the patch wasn't sufficient to prevent unnecessary CPU throttling 3. latency is caused by something other than CPU throttling
To rule out 1, I again checked that our GKE clusters (which are using nodes with Container Optimized OS [COS] VM images) are on a version that contains the CFS patch.
```
dxia@one-of-our-gke-nodes ~ $ uname -a Linux one-of-our-gke-nodes 4.19.112+ #1 SMP Sat Apr 4 06:26:23 PDT 2020 x86_64 Intel(R) Xeon(R) CPU @ 2.30GHz GenuineIntel GNU/Linux
```
Kernel version is 4.19.112+ which is a good sign. I also checked the COS VM image version.
gke-11512-gke3-cos-77-12371-227-0-v200605-pre
The cumulative diff for [COS release notes][2] for cos-stable-77-12371-227-0 show this lineage (see "Changelog (vs ..." in each entry).
cos-stable-77-12371-227-0 77-12371-208-0 77-12371-183-0 77-12371-175-0 77-12371-141-0 Now looking into 2:
This dashboard [5]. Top graph shows an example Container's CPU limit, request, and usage. The bottom graph shows the number of seconds the Container was CPU throttled as measured by sampling the local kubelet's Prometheus metric for `container_cpu_cfs_throttled_seconds_total` over time. CPU usage data is collected from resource usage metrics for Containers from the [Kubernetes Metrics API][6] which is returns metrics from the [metrics-server][7].
The first graph shows usage is not close to the limit. So there shouldn't be any CPU throttling happening.
The first drop in the top graph was decreasing the CPU limit from 24 to match the CPU requests of 16. The decrease of CPU limit from 24 to 16 actually caused CPU throttling to increase. We removed CPU limits from the Container on 8/31 12:00 which decreased number of seconds of CPU throttling to zero. This makes me think the kernel patch wasn't sufficient to prevent unnecessary CPU throttling.
This K8s Github issue ["CFS quotas can lead to unnecessary throttling #67577"][8] is still open. The linked [kernel bug][9] has a comment saying it should be marked fixed. I'm not sure if there are still CPU throttling issues with CFS not tracked in issue #67577 though.
Because of the strong correlation in the graphs between removing CPU limits and CPU throttling, I'm assuming the kernel patch named "Fixed CFS quota throttling issue." in COS 77-12371-141-0 wasn't enough.
Questions
1. Anyone else using GKE run into this issue?
2. Does anyone have a link to the exact kernel patch that the COS entry "Fixed CFS quota throttling issue." contains? A Linux mailing list ticket or patch would be great so I can see if it's the same patch that various blog posts reference.
3. Anyone aware of any CPU throttling issues in the current COS version and kernel we're using? 77-12371-227-0 and 4.19.112+, respectively.
[1]: https://medium.com/omio-engineering/cpu-limits-and-aggressiv...
[2]: https://cloud.google.com/container-optimized-os/docs/release...
[5]: https://share.getcloudapp.com/o0u8KoEn
[6]: https://kubernetes.io/docs/tasks/debug-application-cluster/r...
[7]: https://github.com/kubernetes/kubernetes/tree/master/cluster...
[8]: https://github.com/kubernetes/kubernetes/issues/67577
Re: Kubernetes: Make your services faster by removing CPU limits
#84The core principle most readers miss is that CPU limits are tied to CPU throttling , which is markedly different than CPU time sharing . I would argue that in 99% of cases, you truly do not need or want limits. limits cause CPU throttling, which is like running your process in a strobe light. If your quota period is 100ms, you might only be able to make progress for 10ms out of every 100ms period, regardless of wheth…
+1 The only good reason to use cpu limits I can think of is if you sell metered compute and run it on k8s. I’d be curious to know if anyone actually does this though
Re: Kubernetes: Make your services faster by removing CPU limits
#85Earlier quoted context omitted.
+1 The only good reason to use cpu limits I can think of is if you sell metered compute and run it on k8s. I’d be curious to know if anyone actually does this though
the genesis of cfs_quota and cpu throttling in general has to do with modulating power consumption of a chip, iirc. It's truly a fallacy that limits are needed to prevent noisy neighbor type stuff.
Re: Kubernetes: Make your services faster by removing CPU limits
#86Would the latency of the system be improved by reserving some amount of CPU for the container? For example if a container always got a few milliseconds per period, or if you even reserved a part or all of a CPU for the container.
Re: Kubernetes: Make your services faster by removing CPU limits
#87This is such a bad idea. And I get that they're point is to reduce latency. But the point of k8s is describe your workload accurately and allow it to make decisions on your behalf. The no-brainer way fix this is to set the CPU Requests and Limits to the same value and add an HPA. Setting CPU Requests and Limits to the same value usually gives people the behavior they're expecting. Having more pods in can also reduce latency. But, taking away the Limits hides information about the workload while working around the issue at low to medium workloads. If they were ever to get Black Friday or other 2.5x workload peaks, I'd worry that the Limits removal would cause k8s not to be able to schedule the workload appropriately even if they had enough resources on paper. Remember, the idea of k8s is to scale atomically and horizontally while ensuring availability. If you're making something vertically scale, you'd likely want to re-evaluate that workload.
Re: Kubernetes: Make your services faster by removing CPU limits
#88The core principle most readers miss is that CPU limits are tied to CPU throttling , which is markedly different than CPU time sharing . I would argue that in 99% of cases, you truly do not need or want limits. limits cause CPU throttling, which is like running your process in a strobe light. If your quota period is 100ms, you might only be able to make progress for 10ms out of every 100ms period, regardless of wheth…
Re: Kubernetes: Make your services faster by removing CPU limits
#89Re: Kubernetes: Make your services faster by removing CPU limits
#90Earlier quoted context omitted.
The number of times I’ve seen CPU limits kill off pods during even mild spikes and causing pretty much downtime and “disaster” is just as surprising. Work on autoscaling nodes instead, don’t use cpu limits.
Maybe I'm misunderstanding you, but I'm pretty sure CPU limits will only limit the amount of CPU used even if there is more available. It will not kill off the pod. Memory limits however will kill the pod if the pod uses more than the limit.
In general, the problem is that people don't understand how these complex systems interact -- what do limits do, what are the consequences of limits, how do you decide on correct limits, what do liveness and readiness probes do, what is the kubelet's role in the probes, wait what's a kubelet, etc.