我有一个 Spring API,大量使用部署在 kubernetes 集群上的内存。
我将自动缩放(HPA)配置为将内存消耗视为缩放标准,并运行负载测试在扩大时一切正常,但是在缩小时内存不会下降,因此创建的 pod 不会被删除。如果我再次运行测试,将创建新的 pod,但不会删除。
使用可视 VM 进行本地分析,我认为问题与 GC 有关。本地 GC 在测试期间正常工作,但在请求结束时它停止运行并留下垃圾,并且在很长一段时间后才再次运行。所以我相信留下的这些垃圾正在阻止 HPA 缩小规模。
有没有人对可能导致这种效果的原因或我可以尝试的东西有任何提示?
PS。在分析器中,我没有任何内存泄漏的迹象,当我手动运行 GC 时,剩下的垃圾被删除了
以下是一些额外的细节:
- Java 版本:11
- 春季版:2.3
- Kubernetes 版本:1.17
- Docker 镜像:openjdk:11-jre-slim
- HPA 请求内存:1Gi
- HPA 限制内存:2Gi
- HPA 内存利用率指标:80%
- HPA 最小豆荚:2
- HPA 最大吊舱数:8
- JVM OPS:-Xms256m -Xmx1G