Kubernetes中的CPU限制并不总是显而易见,这可能会导致延迟突然飙升。
要明白为什么,记得它们是如何运作的很重要。
当你设置一个CPU限制时,你为该进程定义了一个CPU时间配额。
例如,1vCPU 限制相当于每 100 毫秒一个完整的核心。
如果你只用了 0.5 vCPU,那么剩下的就浪费掉了。然而,如果你用不了 1.5 vCPU,当你尝试使用,内核会给你用完整的 1 vCPU,但剩下的 0.5 vCPU 就要等到下一周期(即下一 100 毫秒)用了。
但这还没完。你可以在最初的几毫秒内用光你的CPU分配;如果你还需要更多CPU,你还是得等到下一个周期。
使用线程会让情况变得更复杂,因为每个线程也需要CPU时间。
想象一个有10个线程的过程,每个线程需要0.2vCPU。该过程被限制在一个CPU上。以下哪个说法是对的:
- 进程不会被限制。
- 每个线程都可以使用0.1 vCPU,直到它们达到限制。
- 线程共享1 vCPU的配额。如果总使用量超过1 vCPU,所有线程都会被限流。
- 以上情况均不适用。
正确答案是选项3:线程共享1个vCPU的限制额度。如果总需求超过1个vCPU,它们都会被限流。
这是因为所有线程都由同一个进程创建,而cgroup对进程的限制同样适用。
如果一个线程在最初的10毫秒内使用了1个vCPU的所有可用CPU配额,不仅会用完整个预算,还会...
- 其他线程在这100毫秒的周期里无法运行,并且它们的运行将被限制。
- 当前线程也将被限制运行90毫秒(100毫秒减去10毫秒)。
如果你运气不好,在下一个时间片里另一个线程可能会用尽分配给它的CPU时间,导致其他线程饥饿。
你怎么搞定这个?
正确设置CPU限制其实很复杂;在大多数情况下,不设置限制反而更好。如果不设置CPU限制的话,多余的CPU资源就可以被需要的进程利用。
关于是否设定CPU限制,有两篇文章很受欢迎。
如果你喜欢这个,你也会喜欢
- 我们在 Learnk8s 上开设的 Kubernetes 课程。
- 我每周都会发布 Learn Kubernetes Weekly。
- 我连续 20 周发布的 20 个 Kubernetes 概念。
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦