当内存达到 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 代码.. 无论如何都应该这样做。
我在 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 代码.. 无论如何都应该这样做。