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上。以下哪个说法是对的:
正确答案是选项3:线程共享1个vCPU的限制额度。如果总需求超过1个vCPU,它们都会被限流。
这是因为所有线程都由同一个进程创建,而cgroup对进程的限制同样适用。
如果一个线程在最初的10毫秒内使用了1个vCPU的所有可用CPU配额,不仅会用完整个预算,还会...
如果你运气不好,在下一个时间片里另一个线程可能会用尽分配给它的CPU时间,导致其他线程饥饿。
你怎么搞定这个?
正确设置CPU限制其实很复杂;在大多数情况下,不设置限制反而更好。如果不设置CPU限制的话,多余的CPU资源就可以被需要的进程利用。
关于是否设定CPU限制,有两篇文章很受欢迎。
如果你喜欢这个,你也会喜欢