Kubernetes和JVM内存设置



在具有众多微服务的Kubernetes集群中,其中一个微服务专门用于运行Java 1.8数据处理应用程序的Java Virtual Machine(JVM(。

到目前为止,在该JVM pod中运行的作业消耗的RAM不到1GB,因此该pod的最大内存为4GB,而没有任何明确的JVM堆大小设置。

现在,包括JVM在内的整个pod需要大约2.5 GB的新数据(如kubernetes top命令所报告的,在以8 GB的内存限制启动后(,但pod在以4 GB的限制启动后不久就会崩溃。

使用像-Xms256m -Xmx3072m这样的限制为4GB的磁头大小范围并不能解决这个问题。事实上,现在吊舱甚至还没有启动。

是否有任何方法可以参数化JVM以适应所需的2.5GB,而不增加pod的4GB最大内存?

默认的"最大堆";如果未指定-Xmx是主机RAM的1/4(25%(。JDK10改进了对容器的支持,因为它使用容器的RAM限制而不是底层主机。正如@David Maze所指出的,这已经被后移植到JDK 8。

假设您有一个足够新的JDK8版本,您可以使用-XX:MaxRAMPercentage来修改用于Max堆的总RAM的默认百分比。因此,您不必指定-Xmx,而是可以判断,例如-XX:MaxRAMPercentage=75.0。另请参阅https://blog.arkey.fr/2020/10/27/maxrampercentage-is-not-what-i-wished-for/

下面是一个使用alpine JDK docker镜像的示例:https://hub.docker.com/_/openjdk(请特别参阅"让JVM尊重CPU和RAM限制"一节(。

# this is running on the host with 2 GB RAM
docker run --mount type=bind,source="$(pwd)",target=/pwd -it openjdk:8
# running with MaxRAMPercentage=50 => half of the available RAM is used as "max heap"
root@c9b0b4d9e85b:/# java -XX:+PrintFlagsFinal -XX:MaxRAMPercentage=50.0 -version | grep -i maxheap
uintx MaxHeapFreeRatio                          = 100                                 {manageable}
uintx MaxHeapSize                              := 1044381696                          {product}
openjdk version "1.8.0_265"
OpenJDK Runtime Environment (build 1.8.0_265-b01)
OpenJDK 64-Bit Server VM (build 25.265-b01, mixed mode)
# running without MaxRAMPercentage => default 25% of RAM is used
root@c9b0b4d9e85b:/# java -XX:+PrintFlagsFinal -version | grep -i maxheap
uintx MaxHeapFreeRatio                          = 100                                 {manageable}
uintx MaxHeapSize                              := 522190848                           {product}
openjdk version "1.8.0_265"

在我的K8s设置中,我使用consul来管理pod配置。下面是一个命令,用于动态覆盖jvm设置。这是一个非常具体的项目,但如果您使用consul进行配置,它可能会给您一个提示。

kubectl -n <namespace> exec -it consul-server -- bash -c "export CONSUL_HTTP_ADDR=https://localhost:8500 && /opt/../home/bin/bootstrap-config --token-file /opt/../config/etc/SecurityCertificateFramework/tokens/consul/default/management.token kv write config/processFlow/jvm/java_option_xmx -Xmx8192m"

相关内容

  • 没有找到相关文章

最新更新