Cloud Foundry 容器内存增加并最终崩溃

Cloud Foundry Container Memory Increase and finally getting Crashed

我们已经部署并启动了我们的应用程序(Spring 启动应用程序)并在 PCF 中 运行 几天,处理请求并逐渐增加容器内存并达到 80 或 90% ,但根本没有减少。应用曾一度崩溃。

CPU 行为似乎很好,当有负载时它会再次上升和下降。它在本地工作正常 Machine.My 猜测是 GC 在 PCF 容器中没有正常发生。

有没有人遇到过这个问题,谁能帮帮我们。

It works fine in local Machine.

这几乎可以肯定是苹果与橘子的比较(即无效比较)。您的本地环境与 Cloud Foundry 上的应用程序 运行ning 之间很可能存在许多差异。所有这些差异都会影响您的应用 运行s.

我的建议是使用 cf local cf cli 插件在本地 运行 您的应用程序。这将允许您在 docker 容器中本地暂存和 运行 应用程序。它的好处是使用与 运行 在 Cloud Foundry 上暂存的相同 buildpack 暂存应用程序,它还会 运行 您的应用程序在与您的应用程序具有相同内存限制的容器中 运行 在 Cloud Foundry 上。它仍然不完全一样,但它让你更接近。

https://github.com/cloudfoundry-incubator/cflocal

除此之外:

  1. 始终确保您使用的是最新的 Java buildpack 版本。在撰写本文时,应该没有人还在使用 3.x。如果您 运行ning 3.x 发现崩溃,请升级,它们很可能会消失。

    版本4.x对内存使用方式有很多改进 经过计算,它可以更好地防止 JVM 超过 容器中的内存限制和应用程序崩溃。有有 甚至在 4.x 版本中进行了增量改进,所以这是 为什么你想要 运行 最近可用的。

  2. 如果您看到 OutOfMemoryError 异常,这仅意味着您运行正在用尽堆或其他内存段。您可能只需要增加应用程序的内存限制并重新加载。 Java buildpack 将根据您的新内存限制重新计算不同的内存区域,您最终会使用更多内存。或者,您可以设置 JAVA_OPTS 并手动调整 JVM 的内存设置,但不推荐这样做,除非您是专家。

    如果增加内存没有帮助,或者您已经增加了多次但仍然 运行 内存不足,则您可能存在内存泄漏。寻求 APM 工具或探查器的帮助来调试泄漏。

  3. 如果容器崩溃并退出 137(意味着您的应用程序超出了设置的内存限制)并且您运行正在使用最新的 Java buildpack,请查看如果您的应用程序将本机内存(即 JNI)用于任何内容,甚至来自依赖库。这可能会无限增长并导致您超出内存限制。

  4. 与#3 类似,查看您的应用正在使用的线程数。 Java buildpack 估计了合理数量的线程,但它不能限制 JVM 或您的应用程序可以创建的线程数。如果应用程序超出 Java buildpack 估计的线程数,那么您可能会超出内存限制并导致您的应用程序崩溃。要解决此问题,您可以增加估计的线程数、增加内存限制或 decrease/cap 应用程序中的线程使用量。

  5. 如果一切都失败了,您可以enable Java NMT (native memory tracing). This is a little tricky, but it can give you a pretty good picture of where the JVM is using memory. Grab some snapshots during the lifetime of your app and you can usually see which segment is growing and which is causing the app to crash. There's a couple ways to do this to an app running on CF, see here and here了解一些细节。