开发者生态
morning
看在上帝的份上,停止在 Kubernetes 中使用 CPU 限制
2026-08-14
1 阅读
约7分钟阅读
iljanevo
字号:
Kubernetes CPU 限制使您的应用程序速度缓慢且成本高昂 平台工程·分析 我们测试了具有和不具有 CPU 限制的同一个应用程序。相同的代码、相同的 CPU 请求、相同的负载。唯一的区别是极限。以下是我们测量的结果以及如何在您自己的集群上检查它。消除 CPU 限制。即使节点有空闲 CPU,它们每秒也会多次冻结您的应用程序。保留 CPU 请求。请求才是真正的保护。他们保证每个应用程序都有其份额。保持内存限制。记忆力不同。内存限制仍然可以保护节点。更快:尾部延迟在流量峰值下保持不变,而不是崩溃,并且受 CPU 限制的启动工作完成速度加快了约 2 倍(第 5、10 节)。更少的硬件:大多数集群保留的 CPU 远多于高峰时使用的 CPU。放弃限制后调整请求大小可以释放有意义的节点份额(第 10 节)。更便宜:一个可行的、说明性的成本模型将每个集群每年花费数万美元(第 10 节)——插入您自己的价格以获得真实的数字。在此分析中: 1. 请求与限制 · 2. 限制如何工作 · 3. CFS 公平共享 · 4. 最坏的情况 · 5. 我们测量的内容 · 6. 吵闹的邻居 · 7. 当它崩溃时 · 8. .NET 的一步 · 9. 计划 · 10. 结果 · 11. 问答 · 12. 术语表 更深入。此页是论据。其中的每个声明都有一个较长的文档支持,当您阅读并收集时,该文档内联链接:docs/01-theory.md cgroup 机制: cpu.max 与 cpu.weight 、多线程配额刻录以及 CPU 限制真正有帮助的配置。 docs/02-dotnet.md CPU 限制对 .NET 运行时有何影响: ProcessorCount 、ThreadPool 饥饿、GC 堆计数以及 CPU 限制如何导致内存终止。 docs/03-postgres.md Postgres 细节:为什么它在调整自身大小时忽略您的配额,以及这会影响测量到的 PoC,而不是仅仅推断。 docs/04-objections.md 我们遇到的每一个反驳论点都得到了回答——吵闹的邻居、HPA/KEDA、QoS 等级、多租户以及何时限制是正确的。 docs/05-cost.md 完整的成本模型、其假设以及阻止释放的核心变成释放的资金的内存层。 docs/06-rollout.md 分阶段推出:六个步骤,什么门控什么,以及一行回滚。结果/ 基准测试运行的原始输出,加上以下数字的每个场景报告。 1. 两种设置,两种截然不同的作业 CPU 请求 CPU 限制 什么是 CPU 的保证片 硬天花板、墙 保护其他应用程序?是的。 CPU 按请求大小共享。不会。它只会阻止自己的应用程序。节点App上空闲的CPU可能会被免费借用浪费。限制阻止了它。同一个应用程序两次。唯一的区别是对节点空闲 CPU 的访问。两行中的请求(实线)是相同的——借用空闲 CPU 不会从任何人那里得到任何好处。更深层次:这是两个不同的 cgroup 文件,而不是一个旋钮的两个设置。 docs/01-theory.md 详细介绍了 cpu.max(限制)和 cpu.weight(请求)以及每一项实际控制的内容。 2. 限制如何真正停止您的应用程序 内核(操作系统的核心部分)在窗口中强制执行 100 毫秒的限制。 500m 限制(500 毫核,半个核)意味着:每个窗口 50 毫秒的 CPU 时间。当预算用完时,内核会冻结整个应用程序,直到下一个窗口。这就是节流。典型的 .NET 服务运行许多线程:HTTP 处理程序、后台使用者和 GC(垃圾收集器)。所有线程共享一个预算。我们的测试节点有 4 个核心,因此同一时刻最多可以运行 4 个线程。 8 个繁忙线程仍然在大约 12.5 毫秒的实时时间内用完 50 毫秒的预算:冻结每秒重复多达 10 次。下图显示了为什么您的仪表板永远看不到它们。每隔橙色一秒,应用程序就会达到极限,内核就会冻结它。 1 分钟平均值永远不会接近极限,因此每个图表看起来都很健康。这就是容器如何在仪表板保持绿色的情况下全天受到限制的方式。如果您只查看平均 CPU,则看不到这一点 - 请检查container_cpu_cfs_throttled_periods_total。我们证明了这一点。我们将平均只需要320m的负载发送到一个限制为500m的应用程序。平均值从未触及极限。应用程序仍然停滞:相同的应用程序,相同的负载(8 个 5 毫秒的并行任务,每秒 8 个请求)。该限制使慢请求速度减慢了 2.4 倍,而平均 CPU 仍远低于该限制。更深入:为什么并行性使情况比看起来更糟糕——16 个线程在不到 2 毫秒的挂起时间内消耗了 300m 配额——以及为什么结果是停顿而不是减速,这就是破坏尾部延迟的原因,而平均看起来还不错。 3. 没有限制,谁共享CPU?认识 CFS Linux 有一个内置裁判:CFS,完全公平调度器。每个豆荚都有一个重量。 Kubernetes 根据 pod 的 CPU 请求设置权重。规则很简单:当节点完全繁忙时,Pod 根据权重共享 CPU。当 Pod 空闲时,它会停止使用其共享。其他 pod 可以使用该共享。空闲 Pod g
这篇文章对您有帮助吗?
订阅66必读
每日精选科技资讯,直达你的邮箱