各位好。
很长一段时间,我一直在疑惑 k8s CPU limit 该如何设置,太小的值会给程序带来额外的、无意义的延迟( CPU throttling ),太大的值会带来过大的爆炸半径,削弱集群的整体稳定性。更让人纠结的是内核版本低于 4.18 的 Linux 还有个 bug 会造成不必要的 CPU 限流。
最近我算是搞明白了这个问题,记录了下来,希望能帮到与我一样为 CPU limit 和 throttling 纠结过的朋友。
欢迎讨论交流,谢谢。
1
raynix 2021-11-14 14:53:22 +08:00 1
点赞!
|
2
documentzhangx66 2021-11-15 02:35:30 +08:00
两种常用思路:
1.追求稳定而采用固定值。比如路由器、交换机,通常是设置一个固定值。然后使用过大过小的数据负载,来测试性能。便宜的设备,只会在通用数据的情况下,保证一个不差的性能;旗舰级的设备,会使用砸钱堆砌性能过剩的部件,来达到长时间稳定的高性能。 2.如果是业务系统,需要保证长期稳定,一般是不会太考虑性能,方案也是根据经验设置一个固定值。 但如果想获得更大收益,业界通用的做法是,建立一个监督者,根据业务特点与工作负载,制定一些策略,来动态调节这些值,有点像 TCP 的滑动窗口。 |
3
killerirving 2021-11-15 09:58:46 +08:00 1
赞 写的不错
|
4
xabcstack 2021-11-15 16:34:05 +08:00 1
k8s cpu 单位就是时间单位
|
6
xabcstack 2021-11-16 09:57:44 +08:00
1000 ms
|
7
nanmu42 OP @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 |
8
nanmu42 OP @xabcstack 对于 CPU limit 是有个换算关系的,但是并不是 1mCPU = 1msCPU 时间,是 1000mCPU = 100ms CPU 时间 /100ms
|