提问人:Danny Teller 提问时间:10/20/2023 最后编辑:Danny Teller 更新时间:10/21/2023 访问量:130
删除 CPU 限制后,Pod 中的 cpu.stat 指标将归零
cpu.stat metrics in a pod are zeroed when CPU limits are removed
问:
我知道自 2017 年以来,CPU 限制和 cfs 配额的话题受到了很多关注,并且在 kubernetes 上的多个线程中,发布了内核修复等等。我希望在这里找到一些安慰,所以我很困惑,并希望在这个问题上得到帮助。
我们遇到了一些我们真的找不到任何原因的事情,也许这里有人知道。 我们正在检查一些限制问题,并遇到了设置 cpu 限制与未设置 cpu 限制的概念。 因此,我们决定对两者进行测试,看看哪种方法最适合我们。 我们拿了一个 pod 并删除了它的限制 - 但我们发现 - 现在周期、配额和统计数据都是空的
cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us
-1
cat /sys/fs/cgroup/cpu/cpu.cfs_period_us
100000
cat /sys/fs/cgroup/cpu/cpu.stat
nr_periods 0
nr_throttled 0
throttled_time 0
当我们在 pod 中运行 htop 时,当我们检查 /proc/stat 时,我们清楚地看到 cpu 正在使用 - 它充满了有关 cpu 的数据。
grafana 中的指标 - container_cpu_usage_seconds_total - 显示指标。 然而,“container_cpu_cfs_throttled_periods_total”和“container_cpu_cfs_periods_total”对于同一个 pod 是空的
当我们重新设置限制时,这些字段和文件将被填充。 我们对此非常分阶段,因为这意味着我们无法监控对 CPU 没有任何限制的 Pod 上的任何潜在限制。
或者当这些值为零时,是否有其他方法可以监视限制?
这是设计使然吗?有人遇到过这种情况吗?
任何意见将不胜感激,谢谢
即使删除了 Pod 中的 CPU 限制,我们仍然希望在任何级别上监控限制期,因为有些 Pod 可能有限制,而有些 Pod 则有操作系统和内核。
**编辑 我很清楚与 CPU 和限制相关的任何和所有建议。我的问题是,如果有助于监控的指标静态为 0,您将如何监控限制?正如我所提到的,当您删除限制时,不会填充该指标。
答:
通常,Pod 中的 CPU 限制会导致限制是正常行为。如果您在 K8s 中配置 CPU 限制,它将设置周期和配额。如果容器中运行的进程达到限制,则该进程将被抢占,并且必须等待下一个时间段。它被节流了。这就是您正在经历的效果,当删除 CPU 限制时,它会导致节流为 0。
不应将时间段和配额算法视为 CPU 限制,如果未达到,则进程不受限制。该行为令人困惑,并且 github 中也存在 K8s 问题。此处给出的建议是不要为不应受到限制的 Pod 设置 CPU 限制。
在大多数情况下,您实际上不需要 CPU 限制,因为它们会阻止 Pod 使用备用资源。有 Kubernetes 维护者记录在案,说你不应该使用 CPU 限制,而应该只设置请求。这样,Pod 可以自由地使用备用 CPU,而不是让 CPU 保持空闲状态。
相反,即使您删除了此 Pod 的 CPU 限制,其他 Pod 仍可保证其请求的 CPU。CPU 限制仅影响备用 CPU 的分配方式。
评论