我在8 GB内存/ 80 GB磁盘/ Ubuntu 16.04.3 x64 / 4 vCPU的Digital Ocean小滴中使用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看起来不错。 PM2的集群模式有4个进程。
每隔6-8小时,当我的Digital Ocean面板内存达到~88%时,CPU会变得非常高,Web应用程序没有正确响应,PM2必须重新启动过程,不知道网络有多长应用程序不能很好地工作。
以下是发生的事情的图像:
正常工作时表现良好:
我认为我缺少某种配置或类似的东西,因为这种情况总是在同一时期发生。
EDIT1 到目前为止,我修复了代码中的一些不兼容问题(应用程序正在运行,但有时因此而失败),并添加了1GB的memory limit in pm2。我不确定这是否可行,因为我对进程管理有点新意,但CPU级别现在还不错。任何评论表示赞赏。我留下了当前行为的图片,每当四个进程中的一个达到1GB时,它重新启动:
EDIT2 我再添加3张图片,其中2张显示来自Digital Ocean的热门流程,另一张显示Keymetrics状态:
EDIT3 我从我的Angular应用程序中找出了一些内存泄漏(我忘了取消订阅几个订阅)并且系统行为有所改善,但内存行仍然在增加。我将继续调查Angular中的内存泄漏,看看我是否犯了其他错误:
答案 0 :(得分:0)
在我们的(边缘)案例中,kubernetes 健康检查是问题的原因。健康检查通过内部 IP 访问主页。该页面使用调用者 URL(在本例中是它的 IP)来加载一些它无法通过这种方式找到的资源。这会导致错误并以某种方式缓存并慢慢耗尽所有内存。由于健康检查的规律性,我们即使在夜间也有同样非常线性的内存增长。
我们通过让健康检查调用“/health”来解决这个问题,我们只返回一个 200 代码..无论如何都应该这样做。