gpt4 book ai didi

基于 JVM 堆内存的 Kubernetes HPA

转载 作者:行者123 更新时间:2023-12-02 16:07:41 39 4
gpt4 key购买 nike

我有一个在 Kubernetes 集群上运行的 openjdk:8 镜像。我添加了内存 HPA(Horizo​​ntal Pod Autoscaling),它可以很好地扩展,但由于 JVM 不会将内存从堆释放回操作系统,因此 Pod 不会缩小。以下是 hpa.yaml

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: image-server
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: image-server
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 60
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 60

解决此问题的一种方法是使用正确的 GC 并使其释放内存,但由于出于性能原因 JVM 被设计为不经常从堆中释放内存,因此这样做并不是一个好主意。有没有办法从 Kubernetes 处理这个问题?就像不检查操作系统的内存使用情况一样,我们是否可以不检查堆中的内存使用情况并对其进行扩展?

最佳答案

在 Kubernetes 中扩展 Java 应用程序有点棘手。 HPA 仅查看系统内存,正如所指出的,JVM 通常不会释放已提交的堆空间(至少不会立即释放)。

解决这个问题主要有两种方法

1。调整 JVM 参数,使提交的堆更接近使用的堆

根据使用的 JVM 和 GC,调整选项可能略有不同,但最重要的是

  • MaxHeapFreeRatio - 允许未使用的提交堆有多少
  • GCTimeRatio - 允许 GC 运行的频率(影响性能)
  • AdaptiveSizePolicyWeight - 如何在计算新堆时权衡较旧和较新的 GC 运行

为这些提供准确的值并不容易,它是快速释放内存和应用程序性能之间的折衷。最佳设置将取决于应用程序的负载特性。

Patrick Dillon 撰写了一篇由 RedHat 发表的文章,名为 Scaling Java containers深入探讨了这个主题。

2。自定义缩放逻辑

您可以创建自己的扩展逻辑并将其作为定期运行的作业部署到 Kubernetes 中,而不是使用 HPA:

  1. 检查所有 pod 中的堆使用情况(例如通过在 pod 中运行 jstat)
  2. 如果达到最大阈值,则横向扩展新 pod
  3. 如果达到最小阈值则缩减 pod

这种方法的好处是可以查看实际的堆使用情况,但需要自定义组件。

这方面的一个例子可以在文章 Autoscaling based on CPU/Memory in Kubernetes — Part II 中找到。通过 powercloudup

关于基于 JVM 堆内存的 Kubernetes HPA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68934557/

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