Java教程

挑战16:被限流的CPU

本文主要是介绍挑战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限制,有两篇文章很受欢迎。

  • 天哪,为了爱,请停止在Kubernetes中使用CPU限制
  • 为何你应该继续在Kubernetes中使用CPU限制

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

  • 我们在 Learnk8s 上开设的 Kubernetes 课程。
  • 我每周都会发布 Learn Kubernetes Weekly。
  • 我连续 20 周发布的 20 个 Kubernetes 概念。
这篇关于挑战16:被限流的CPU的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!