k8s CPU limit 和 throttling 的迷思

2021-11-14 11:29:54 +08:00
 nanmu42

各位好。

很长一段时间,我一直在疑惑 k8s CPU limit 该如何设置,太小的值会给程序带来额外的、无意义的延迟( CPU throttling ),太大的值会带来过大的爆炸半径,削弱集群的整体稳定性。更让人纠结的是内核版本低于 4.18 的 Linux 还有个 bug 会造成不必要的 CPU 限流。

最近我算是搞明白了这个问题,记录了下来,希望能帮到与我一样为 CPU limit 和 throttling 纠结过的朋友。

欢迎讨论交流,谢谢。

2462 次点击
所在节点    Kubernetes
8 条回复
raynix
2021-11-14 14:53:22 +08:00
点赞!
documentzhangx66
2021-11-15 02:35:30 +08:00
两种常用思路:

1.追求稳定而采用固定值。比如路由器、交换机,通常是设置一个固定值。然后使用过大过小的数据负载,来测试性能。便宜的设备,只会在通用数据的情况下,保证一个不差的性能;旗舰级的设备,会使用砸钱堆砌性能过剩的部件,来达到长时间稳定的高性能。

2.如果是业务系统,需要保证长期稳定,一般是不会太考虑性能,方案也是根据经验设置一个固定值。

但如果想获得更大收益,业界通用的做法是,建立一个监督者,根据业务特点与工作负载,制定一些策略,来动态调节这些值,有点像 TCP 的滑动窗口。
killerirving
2021-11-15 09:58:46 +08:00
赞 写的不错
xabcstack
2021-11-15 16:34:05 +08:00
k8s cpu 单位就是时间单位
nanmu42
2021-11-15 23:37:23 +08:00
@xabcstack 感觉好像不是? m 的意思应该是千分之一,就像毫米毫秒里的 m 那样?
xabcstack
2021-11-16 09:57:44 +08:00
1000 ms
nanmu42
2021-11-16 12:06:07 +08:00
@xabcstack 恐怕不对,文档里是这么说的:

> For CPU resource units, the expression 0.1 is equivalent to the expression 100m, which can be read as "one hundred millicpu". Some people say "one hundred millicores", and this is understood to mean the same thing.

https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#meaning-of-cpu

另外 1000m = 1 CPU ,对应的是默认配置下 100ms 的 CPU 时间:

> The spec.containers[].resources.limits.cpu is converted to its millicore value and multiplied by 100.

https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#how-pods-with-resource-limits-are-run
nanmu42
2021-11-16 12:09:43 +08:00
@xabcstack 对于 CPU limit 是有个换算关系的,但是并不是 1mCPU = 1msCPU 时间,是 1000mCPU = 100ms CPU 时间 /100ms

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/815250

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX