代码之家  ›  专栏  ›  技术社区  ›  Diego

内存达到88%时服务器崩溃

  •  2
  • Diego  · 技术社区  · 6 年前

    我在一个8 GB内存/80 GB磁盘/Ubuntu 16.04.3 x64/4 vCPU的数字海洋中使用服务器端渲染,使用Angular universal和PM2作为进程管理器。

    我使用6GB交换文件,当“free-m”为以下值时,可用内存为:

              total    used        free      shared  buff/cache   available
    Mem:       7983    1356        5290          16        1335        6278
    Swap:      6143      88        6055
    

    这个 ram used 看起来不错。共有4个过程采用PM2集群模式。

    每隔6-8小时,当我的Digital Ocean面板中的内存达到88%时,CPU就会变得非常高,web应用程序无法正确响应,PM2必须重新启动进程,不确定web应用程序的工作时间。

    下面是发生的情况的图像:

    CPU and Memory of the server

    正常工作时性能良好:

    Web application performance

    我想我缺少了某种配置或其他东西,因为这种情况总是在同一时间段发生。

    编辑1 到目前为止,我修复了代码中的一些不兼容之处(应用程序正在运行,但有时会因此而失败),并添加了 memory limit in pm2 1GB。我不确定这是否是一种方式,因为我对进程管理有点陌生,但CPU级别现在很好。如有任何评论,我们将不胜感激。我留下了当前行为的图片,每当四个进程中的一个达到1GB时,它就会重新启动:

    enter image description here

    编辑2 我又添加了3张图像,2张显示了Digital Ocean的顶级流程,还有一张显示了Keymetrics状态:

    Memory top processes CPU top processes Keymetrics processes

    编辑3 我从Angular应用程序中发现了一些内存泄漏(我忘记取消订阅了几个订阅),系统行为得到了改善,但内存仍在增加。我将继续调查Angular中的内存泄漏,看看是否犯了其他错误:

    Memory RAM edit3

    2 回复  |  直到 6 年前
        1
  •  1
  •   Oliver Gur Kamal Singh Badal    6 年前

    看起来您的Angular Universal应用程序正在泄漏内存,您观察到的内存不应该随着时间的推移而增加,而应该基本保持不变。

    您可以尝试查找内存泄漏(看起来您已经发现了一个问题,并且怀疑它可能是什么)。

    你可以尝试的另一件事是定期重启你的应用程序。 看见 here 例如,如何每隔几个小时重新启动pm2进程,以重置并防止遇到OOM情况。

        2
  •  0
  •   Pascal R.    3 年前

    在我们的(edge)案例中,kubernetes健康检查是问题的原因。healthcheck通过内部IP访问主页。页面使用调用者URL(在本例中是其IP)加载一些它无法找到的资源。这导致了一个错误,以某种方式被缓存,并慢慢耗尽了所有内存。由于健康检查的规律性,即使在晚上,我们的记忆力也有同样的直线上升。

    我们通过让healthcheck调用“/health”来解决这个问题,其中我们只返回200代码。。不管怎样,我们都应该这样做。