gpt4 book ai didi

java - Docker 容器中的 JVM 初始 CPU 峰值

转载 作者:搜寻专家 更新时间:2023-11-01 03:31:09 24 4
gpt4 key购买 nike

我有几个 Java 项目在 Kubernetes 管理的 Docker 容器中运行。我想启用基于 Kubernetes 提供的 CPU 的 Horizo​​ntal Pod Autoscaling(HPA),但我发现很难处理初始化容器时由 JVM 引起的初始 CPU 峰值。

我目前还没有在任何项目的 Kubernetes yaml 文件中设置 cpu 限制,这基本上意味着我让 pod 从环境中获取尽可能多的 CPU(我知道这是一种不好的做法,但它让我在不到 30 秒的时间内启动了 JVM pod)。
这造成的问题是,在创建 pod 的前 3-4 分钟内,CPU 使用率会飙升太多,以至于如果我设置了自动缩放规则,它就会触发它。自动缩放的 pod 将旋转起来并导致相同的尖峰并重新触发自动缩放,直到达到最大 pod 数量并且事情稳定下来。
我尝试在 kubernetes yaml 文件中设置 cpu 限制,但如果我的项目需要的 cpu 数量不是那么大,那么通过将其设置为非过度杀伤量会使我的 pod 在超过 5 分钟内旋转,这是 Not Acceptable 。
我也可以将自动缩放延迟增加到 10 分钟以上,但它是一个全局规则,也会影响我需要快速缩放的部署,因此这对我来说也不是一个可行的选择。

这是我的一个 pod 的示例 cpu 和内存配置

 env:
resources:
requests:
memory: "1300Mi"
cpu: "250m"
limits:
memory: "1536Mi"

我最近还迁移到了 Java 10,它应该针对容器化进行了优化。任何建议或评论将不胜感激。提前致谢。

编辑:
我也可以根据 http_requests 等自定义 prometheus 指标设置 hpa,但该选项将更难维护,因为有很多变量会影响 pod 可以处理的请求量。

最佳答案

取决于您的 K8 版本。

< 1.12 :
正如您所解释的那样,在此版本中,您只有 --horizontal-pod-autoscaler-upscale-delay Kube-Controller 的标志或 HPAv2 中的自定义指标。 https://v1-11.docs.kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/

=>1.12 :
这里我们得到了一个新的 HPA 算法,它丢弃了 unReady计算中的 pod 导致更少的自动更正。

https://github.com/kubernetes/kubernetes/pull/68068

Change CPU sample sanitization in HPA. Ignore samples if:
- Pod is beeing initalized - 5 minutes from start defined by flag
- pod is unready
- pod is ready but full window of metric hasn't been colected since transition
- Pod is initialized - 5 minutes from start defined by flag:
- Pod has never been ready after initial readiness period.

这应该对您有所帮助。

关于java - Docker 容器中的 JVM 初始 CPU 峰值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54290725/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com