为了账号安全,请及时绑定邮箱和手机立即绑定

挑战16:被限流的CPU

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限制,有两篇文章很受欢迎。

如果你喜欢这个,你也会喜欢

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
手记
粉丝
75
获赞与收藏
402

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消