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

Server collapses when memory reaches 88%

我在 8 GB 内存/80 GB 磁盘/Ubuntu 16.04.3 x64 的 Digital Ocean droplet 中使用 Angular 通用服务器端渲染,PM2 作为进程管理器/ 4 vCPUs.

我使用了一个6GB的交换文件,"free -m"时的可用内存如下:

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

ram used 看起来不错。集群模式为PM2的进程有4个

每隔 6-8 小时,当我的 Digital Ocean 面板中的内存达到 ~88% 时,CPU 变得非常高,Web 应用程序无法正确响应并且 PM2 必须重新启动进程,而不是确定 Web 应用程序无法正常运行多长时间。

这是发生的事情的图像:

正常工作时性能还可以:

我想我缺少某种配置什么的,因为这种情况总是在同一时间段发生。

EDIT1 到目前为止,我修复了我的代码中的一些不兼容问题(该应用程序正在运行,但有时因此失败),并添加了 1GB 的 memory limit in pm2。我不确定这是否可行,因为我对流程管理有点陌生,但 CPU 级别现在很好。任何评论表示赞赏。我留下一张当前行为的图片,每当四个进程之一达到 1GB 时,它就会重新启动:

EDIT2 我再添加 3 张图片,其中 2 张显示来自 Digital Ocean 的顶级进程,一张显示 Keymetrics 状态:

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

您的 Angular 通用应用程序似乎正在泄漏内存,正如您观察到的那样,它不应随着时间的推移而增加,但基本保持平稳。

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

您可以尝试的另一件事是定期重启您的应用程序。 请参阅 here 例如,如何每隔几个小时重新启动您的 pm2 进程以重置和防止您 运行 遇到的 OOM 情况。

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

我们通过让健康检查调用“/health”解决了这个问题,我们只 return 一个 200 代码.. 无论如何都应该这样做。