【发布时间】:2018-07-23 08:08:05
【问题描述】:
我的 Java 微服务在 AWS EC2 实例上托管的 k8s 集群中运行。
我在 K8s 集群中运行了大约 30 个微服务(nodejs 和 Java 8 的良好组合)。我面临一个挑战,我的 java 应用程序 pod 意外重启,导致应用程序 5xx 计数增加。
为了调试这个,我在 pod 中启动了一个 newrelic 代理和应用程序,发现了下图:
我可以看到,我的 Xmx 值为 6GB,我的使用量最大为 5.2GB。
这清楚地表明 JVM 没有超过 Xmx 值。
但是当我描述 pod 并查找最后一个状态时,它显示“原因:错误”和“退出代码:137”
然后在进一步调查中,我发现我的 Pod 平均内存使用量一直接近其极限。(分配的 9Gib,使用 ~9Gib)。我无法理解为什么 Pod 中的内存使用量如此之高,即使我只有一个进程正在运行((JVM)并且这也受到 6Gib Xmx 的限制。
当我登录到我的工作节点并检查 docker 容器的状态时,我可以看到该应用程序的最后一个容器,状态为 Exited,并显示“Container exits with non-zero exit code 137”
我可以看到wokernode内核日志为:
这表明内核正在终止我在容器内运行的进程。
我可以看到我的工作节点中有很多可用内存。
我不确定为什么我的 pod 会一次又一次地重新启动,这是 k8s 的行为还是我的基础架构中的某些恶作剧。这迫使我再次将我的应用程序从 Container 移动到 VM,因为这会导致 5xx 计数增加。
编辑:将内存增加到 12GB 后,我遇到了 OOM。
我不确定为什么 POD 会因为 OOM 而被杀死 JVM xxx 只有 6 GB。
需要帮助!
【问题讨论】:
-
你能从 pod 中获取进程,看看是什么消耗了内存吗?
-
只有java!
-
您的应用程序是重盘消费者吗?我对此有类似的问题,并且所有内容(在我的情况下)都指向内核的文件缓存。如果你做一个 top pods 会告诉你 k8s 如何查看你的 pods 内存使用情况。
标签: docker linux-kernel kubernetes newrelic datadog