当前位置: 首页 > 知识库问答 >
问题:

Pod CPU节流

施靖
2023-03-14

在Kubernetes中使用CPU请求/限制时,我遇到了一个奇怪的问题。在设置任何CPU请求/限制之前,我的所有服务都执行得很好。我最近开始设定一些资源配额,以避免未来资源匮乏。这些值是根据这些服务的实际使用情况设置的,但令我惊讶的是,在添加这些值之后,一些服务开始大幅增加响应时间。我的第一个猜测是,我可能放置了错误的请求/限制,但查看这些指标发现,事实上,面对这个问题的服务中没有一个接近这些值。事实上,其中一些更接近于请求而非限制。

然后我开始查看CPU限制指标,发现我所有的pod都被限制了。然后我将其中一个服务的限制增加到1000m(从250m),并且我看到该pod中的限制减少了,但是我不明白如果pod没有达到它的旧限制(250m),为什么我应该设置更高的限制。

所以我的问题是:如果我没有达到CPU限制,为什么我的吊舱会节流?如果吊舱未满负荷运行,为什么我的响应时间会增加?

这里有一些我的指标截图(CPU请求:50m,CPU限制:250m):

kubectl上衣

P、 S:在设置这些请求/限制之前,根本没有限制(如预期的那样)

P、 S 2:我的所有节点都没有面临高使用率。事实上,它们中没有一个在任何时候使用超过50%的CPU。

提前感谢!

共有3个答案

范书
2023-03-14

TLDR:删除CPU限制。(除非此警报在metrics server上触发,在这种情况下无法工作。)CPU限制实际上是一种不好的做法,而不是最佳做法。

我将专注于该做什么,但首先让我举一个简单的例子来说明为什么会发生这种情况:

  1. 想象一个CPU限制为100m的pod,相当于1/10 vCPU。
  2. 豆荚10分钟内什么都不做。
  3. 然后它不间断地使用CPU 200ms。突发期间的使用量相当于2/10 vCPU,因此pod超过了它的限制并将被限制。
  4. 另一方面,平均CPU使用率将非常低。

在这种情况下,您将被限制,但突发非常小(200毫秒),它不会显示在任何图形中。

实际上,在大多数情况下,您不需要CPU限制,因为它们会阻止POD使用备用资源。有Kubernetes维护人员表示,不应该使用CPU限制,而应该只设置请求

我写了一个完整的wiki页面,介绍了为什么在CPU使用率较低的情况下会发生CPU节流,以及如何应对。我还讨论了一些常见的边缘情况,例如如何为不遵循常规规则的metrics server处理此问题。

秦哲瀚
2023-03-14

Kubernetes使用(完全公平调度程序)CFS配额来强制pod容器的CPU限制。请参阅中描述的“CPU管理器如何工作”https://kubernetes.io/blog/2018/07/24/feature-highlight-cpu-manager/了解更多详细信息。

CFS是Linux的一个特性,添加了2.6.23内核,它基于两个参数:cpu。cfs\u period\u us和cpu。cfs\U quota为了可视化这两个参数,我想从Daniele Polencic的优秀博客中借用以下图片(https://twitter.com/danielepolencic/status/1267745860256841731):

如果在K8s中配置CPU限制,它将设置时段和配额。如果在容器中运行的进程达到限制,它将被抢占,并且必须等待下一个周期。它被节流。这就是你正在经历的效果。周期和配额算法不应被视为CPU限制,如果未达到该限制,则进程将不受限制。这一行为令人困惑,同时也存在K8s问题:https://github.com/kubernetes/kubernetes/issues/67577中给出的建议https://github.com/kubernetes/kubernetes/issues/51135就是不为不应限制的POD设置CPU限制。

华福
2023-03-14

如果您在为cpu发出请求时看到文档,它实际上使用了Docker中的“cpu共享”选项,该选项实际使用了cpu。Linux上cpu、cpuacct cgroup的shares属性。因此,基于最大值为1024,50米的值大约是cpu共享=51<代码>1024表示100%的股份,因此51将是4-5%的股份。首先,这个数字很低。但这里重要的因素是,这与系统上有多少吊舱/容器以及这些吊舱/容器的cpu共享量有关(它们是否使用默认值)。

假设在您的节点上,您有另一个具有1024个共享的pod/容器,这是默认值,并且您有这个具有4-5个共享的pod/容器。然后这个容器将获得大约0.5%的CPU,而另一个pod/容器将获得大约99.5%的CPU(如果它没有限制)。所以这一切都取决于您在节点上有多少pod/容器以及它们的份额是多少。

此外,在库伯内特斯文档中没有很好的记录,但是如果您在pod上使用Limit,它基本上在Docker中使用了两个标志:--cpu-时期和--cpu-配额,它实际上使用了cpu的cpu.cfs_period_us和cpu.cfs_quota_us属性,Linux上的cpuacct cgroup。这是因为cpu.shares没有提供限制,所以您会溢出容器会占用大部分CPU的情况。

因此,就这个限制而言,如果在同一节点上有其他没有限制(或更高限制)但cpu更高的容器,就永远不会达到这个限制。共享,因为它们最终将优化和挑选空闲CPU。这可能是你所看到的,但同样取决于你的具体情况。

以上所有内容的详细解释。

 类似资料:
  • 本文向大家介绍system.reactive 节流,包括了system.reactive 节流的使用技巧和注意事项,需要的朋友参考一下 示例 假设您需要实现一个自动搜索框,但是搜索操作的成本较高,例如发送Web请求或建立数据库。您可能想限制搜索的数量。 例如,用户在搜索框中输入“ C#Reactive Extensions”: 现在,我们不想在用户每次按键时都执行搜索。取而代之的是,只要用户停止输

  • 问题内容: 使用时是否可以轻松地限制kbps ?如果是这样的话,将不胜感激您可以指导我的任何代码示例或资源。 问题答案: 模块中有功能。如果将-function / object实现为令牌存储桶或泄漏存储桶,则将具有全局速率限制。 编辑: 仔细检查后,我发现进行全球限速并不像我想的那么容易。仅给出下载量和总大小,仅靠它们本身不足以提供与令牌桶配合使用的信息。解决该问题的一种方法是,在每个速率限制器

  • 我试图弄清楚骆驼的节流概念。我已经看到了骆驼的航线政策,但这适用于许多飞行中的交换。 我的路线如下: 现在我的用例是,我想在这些路由之间传输比如说2000条消息,我知道可以通过来完成。但是,我不得不决定如何在下一个2000条消息被路由时控制它。我只想在接收者队列变为空时路由下2000条消息。 例如,消息从队列路由到。假设2K消息已成功路由,现在我想挂起我的路由,这样它就不会传输更多的消息,直到队列

  • 如果我没弄错的话,树通常是一个列表,其中的元素按特定顺序排列。孩子们不在他们自己的子列表中,他们都在同一个列表中。 所以,我试图创建一个Tree类,其中包含TreeNodes(类)使用Tree类中的List。 我如何跟踪父母/孩子/叶子?如果父母“父母1”,有两个孩子“孩子A”和“孩子B”,我如何将他们联系在一起?

  • 可以运行不需要连接到cadence服务器的本地活动。是否有适当的方式在本地运行工作流,以防发生cadence中断?我正在使用Go客户端。

  • 问题内容: 方案:各种文件的大小以字节为单位存储在数据库中。将大小信息格式化为千字节,兆字节和千兆字节的最佳方法是什么?例如,我有一个MP3,Ubuntu显示为“ 5.2 MB(5445632字节)”。如何在网页上将其显示为“ 5.2 MB”,并且文件大小小于1 MB的文件显示为KB,文件大小大于1 GB的文件显示为GB? 问题答案: (取自php.net,那里还有许多其他示例,但我最喜欢这个示例