K8容器编排:JVM不释放内存

问题描述

我们有基于Java的微服务。当这些微服务不满足任何请求时,该微服务的每个pod都使用约270MB。我们将每个微服务的内存限制保持为512Mi。

我对其中一些微服务进行了负载测试。对于一个微服务,我每秒发出20个API请求。另外,每秒30个请求。
我观察到的一个一致的模式是:随着负载增加,内存利用率会上升,并且在负载测试后内存不会释放(除非容器被终止)。
一旦完成负载测试,我将等待一个小时左右。但是,内存利用率并没有下降。该Pod继续占用与以前相同的内存量。
我还在这样的容器的容器内有一个外壳,我只能看到java processsh process的运行。确实,我看到Pod的内存使用量已增加到约360MB。

因此,一个Pod通常需要270MB(不进行任何负载测试),要经过360MB的负载测试(每秒30个API请求),并在负载测试完成后继续使用360MB。

我不明白为什么吊舱使用率没有下降。

可能是:

  1. JVM堆使用问题,可能未发生垃圾收集?
  2. 与Kubernetes Pod请求和限制设置有关的事情吗?

以下是我对Kubernetes吊舱的要求和限制:

  resources:
    limits:
      memory: 512Mi
      cpu: '0.5'
    requests:
      memory: 256Mi
      cpu: '0.1'

顺便说一句,我正在使用Apache JMeter进行API负载测试。 正在使用的Docker映像为: openjdk:8-alpine
我还下载了堆转储,并在Eclipse Memory analyzer tool中打开了它。
但是,我看不到任何使用大量堆的应用程序类(来自我们的代码)。
我只看到与JDK和Spring框架相关的类,并且它们不显示任何内存泄漏。

所以,对我来说,一个谜是:为什么即使在负载测试后2-3小时内存使用率也不会下降?
是请求和限制的Kubernetes配置,还是JVM GC设置调整?
JVM GC设置是否可能不能很好地与Kubernetes请求和内存限制配合使用?

添加JVM详细信息以供参考:

openjdk version "1.8.0_212"
OpenJDK Runtime Environment (IcedTea 3.12.0) (Alpine 8.212.04-r0)
OpenJDK 64-Bit Server VM (build 25.212-b04,mixed mode)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)