我有大约30个微服务(包括Nodejs和Java 8),运行在一个K8s集群中。我面临一个挑战,我的Java应用程序Pod会意外重启,导致应用程序5xx计数增加。
为了调试这个问题,我在Pod中启动了一个Newrelic代理,同时与应用程序一起运行,并发现以下图形:
我可以看到,我的Xmx值为6GB,而我的使用量最大只有5.2GB。
这清楚地表明JVM没有超过Xmx值。
但是当我描述Pod并查看最后一个状态时,它显示“原因:错误”,并带有“退出代码:137”。
进一步调查后,我发现我的Pod平均内存使用率一直接近其限制。(分配了9Gib,使用了约9Gib)。我无法理解为什么Pod的内存使用率如此之高,即使我只运行了一个进程(JVM),而且还将其限制在6Gib Xmx。
当我登录到我的工作节点并检查docker容器的状态时,我可以看到该应用程序的最后一个容器处于Exited状态,并显示“容器以非零退出码137退出”。我可以看到工作节点内核日志如下:
这表明内核正在终止我在容器内运行的进程。
我可以看到我的工作节点上有很多空闲内存。
我不确定为什么我的Pod会一遍又一遍地重启,这是Kubernetes的行为还是基础设施中的某些欺骗行为。这迫使我再次将应用程序从容器移动到虚拟机上,因为这导致5xx计数增加。编辑:在将内存增加到12GB后,我遇到了OOM问题。
我不确定为什么由于OOM而导致POD被终止,尽管JVM的xmx仅为6 GB。
需要帮助!