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

中设置内存请求小于限制的用例是什么?K8s

沈宏朗
2023-03-14

我理解设置CPU请求小于限制的用例——如果实例有空闲CPU,它允许每个容器中的CPU爆发,从而导致最大CPU利用率。然而,我真的找不到对内存做同样事情的用例。大多数应用程序在分配内存后不会释放内存,因此实际上应用程序会请求“限制”内存(这与设置request = limit的效果相同)。唯一的例外是在已经分配了所有内存的实例上运行的容器。我看不出这有什么好处,坏处是更不确定的行为,很难监控(由于繁重的GC,一个容器比另一个容器有更高的延迟)。我能想到的唯一用例是内存缓存中的阴影,在这种情况下,您需要考虑内存使用的峰值。但是,即使在这种情况下,也存在其中一个节点性能不佳的风险。

共有2个答案

南门飞
2023-03-14

事实上,你提到的话题很有趣,同时也很复杂,就像Linux内存管理一样。正如我们所知,当进程使用的内存超过限制时,它会在潜在的“杀死”进程“阶梯”上迅速上升。更进一步,限制的目的是告诉内核什么时候应该考虑进程可能被杀死。另一方面,请求是直接声明“我的容器将需要这么多内存”,但除此之外,它们还向调度程序提供了关于可以在哪里调度Pod的有价值的信息(基于可用的节点资源)。

如果没有内存请求和上限,Kubernetes 会将请求默认为限制(这可能会导致调度失败,即使满足 pods 的实际需求也是如此)。

如果您设置了一个请求,但不是限制 - 容器将使用命名空间的默认限制(如果没有,它将能够使用整个可用的节点内存)

设置低于限制的内存请求将会给你的pod空间来进行突发活动。此外,您还要确保Pod在加速期间可以使用的内存实际上是一个合理的数量。

设置内存限制==内存请求是不可取的,因为活动峰值会使它在高速公路上被内核杀死。如果内存压力是最有可能的情况,库伯内特斯中的内存限制就不能被限制(让我们记住没有交换分区)。

引用威尔·汤姆林(Will Tomlin)和他关于请求与限制的有趣文章,我强烈推荐:

您可能会问是否有理由将限制设置为高于请求。如果您的组件具有稳定的内存占用,则可能不应该这样做,因为当容器超出其请求时,如果工作节点遇到内存不足的情况,则更有可能被逐出。

总而言之 - 没有直接和简单的答案。您必须确定内存要求,并使用监视和警报工具来控制并准备好根据需要更改/调整配置。

景元徽
2023-03-14

也许不是真正的答案,而是对这个主题的看法。

与CPU和内存限制的区别在于当达到限制时会发生什么。在CPU的情况下,容器保持运行,但是CPU的使用是有限的。如果达到内存限制,容器将被终止并重新启动。

在我的用例中,我经常将内存请求设置为应用程序平均使用的内存量,限制为25%。这让我在大多数时候避免了容器杀戮(这很好),但这当然会使我面临内存过度分配的问题(正如您所提到的,这可能是一个问题)。

 类似资料:
  • 问题内容: 我的应用程序的用户尝试使用我的应用程序将文件作为电子邮件附件发送。但是,这样做会引发以下异常,我无法解读 什么是“软私有内存限制”?有什么可能导致此异常? 问题答案: “软专用内存限制”是App Engine将停止实例接收任何更多请求,等待任何未完成的请求并终止该实例的内存限制。当您使用过多内存时,可以将其视为正常关机。 偶尔达到软限制是可以的,因为您的所有请求均已完成。但是,每次发生

  • 首先,正如Kubernetes所描述的:pod和cpu限制当我们不指定cpu限制时,pod可以使用节点的所有cpu。这也适用于内存吗?意味着当我们没有指定限制时,pod是否会在需要时开始使用所有内存? 其次,让我们考虑一下,我们有一个具有2GB内存的工作节点,我们在这个节点上部署了8个POD,分配256Mi请求并限制这8个POD中的每一个是否正确?是否建议对所有POD应用相同的限制? 第三,如果我

  • 问题内容: 对不起,如果重复的话,我认为可以,但是找不到任何东西。 我有一个Flex应用程序,我正在通过IE将数据发布回php / mysql服务器。我还没有遇到任何问题,但是提前知道这一点可以为我省去很多麻烦和工作。通过http发布数据有大小限制吗? 而这一切都是我可以在网上找到的。因此, 请将 答案限制在经过个人测试/验证的数字上。 我想回发一个可能很大的XML字符串(比如说最多5mb)。 如

  • 我正在开发一个应用程序,使用谷歌应用程序引擎的付费服务。在应用程序中,我正在解析一个大型xml文件,并试图将数据提取到数据存储中。但在执行此任务时,GAE向我抛出了一个错误,如下所示 我还试图通过将前端实例类从F1增加到F2来更改性能设置。 错误:在为总共14个请求提供服务后,超过了128 MB的软私有内存限制,为133 MB。处理此请求后,发现处理此请求的进程占用了太多内存,因此被终止。这可能会

  • 问题内容: 我发现真正令人困惑的是,为什么AJAX请求限于同一域?这背后的原因是什么? 我从外部位置请求文件没有任何问题,发出XMLHTTP请求的服务器似乎也可以很好地发送和发布到外部位置。 问题答案: 图片如下: 您来到我神话般的网站www.halfnakedgirls.com。您很乐意观看看起来像人类生理学的技术文档,但是在您的背后,一些JavaScript行正在向另一个域执行某些请求,比如说

  • 问题内容: 对于我的应用程序,Java进程使用的内存远远大于堆大小。 容器运行所在的系统开始出现内存问题,因为容器占用的内存比堆大小大得多。 堆大小设置为128 MB(-),而容器最多占用1GB的内存。正常情况下需要500MB。如果docker容器的限制低于(例如),则该进程将被操作系统的内存不足杀手杀死。 你能解释一下为什么Java进程使用的内存比堆多得多吗?如何正确调整Docker内存限制的大