隐患概述
服务器芯片由X86迁移到ARM过程中产生的问题:JDK参数默认值变化导致jvm内存占用超限的隐患
隐患案例
某系统因微服务java内存占用超过POD上限,被k8s监控到并杀死。
隐患说明
在国产化迁移过程中,因为国产化和非国产化打包使用的基础镜像不同(x86 vs arm),这两个版本的jdk对该参数的控制和默认值处理有差异,因此导致国产化迁移后会产生-XX:MaxDirectMemorySize参数默认值变化,同时在其他基础镜像发生变化的场景也会产生该问题。
一个java进程可以使用的内存,由heap buffer和direct buffer两部分组成,heap大小(能分配的空间的限额)由-Xmx参数决定,direct buffer大小(能分配的空间的限额)由-XX:MaxDirectMemorySize参数决定,在新的arm镜像中不设置则默认值是-Xmx对应的值。结合发生故障的服务的实际参数:POD申请内存上限为48G,-Xmx设置为42G,-XX:MaxDirectMemorySize未设置,这样意味着java进程最多可能用到42*2=84G内存,会超过POD的48G上限,因此被K8S监测到并杀死,从而导致故障。
防范建议
-
检查已完成国产化迁移的微服务参数配置,并按需整改。
-
国产化迁移时根据容器的限额,设置 -XX:MaxDirectMemorySize 参数,同时梳理和调整所有微服务的相关参数。